diff --git a/plugins/org.eclipse.uml2.uml/model/UML.ecore b/plugins/org.eclipse.uml2.uml/model/UML.ecore
index 3a707c4..2ef4847 100644
--- a/plugins/org.eclipse.uml2.uml/model/UML.ecore
+++ b/plugins/org.eclipse.uml2.uml/model/UML.ecore
@@ -52,14 +52,24 @@
         <details key="documentation" value="An element may not directly or indirectly own itself.&#xD;&#xA;not self.allOwnedElements()->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_owner" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Elements that must be owned must have an owner.&#xD;&#xA;self.mustBeOwned() implies owner->notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="destroy" ordered="false" lowerBound="1">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -304,7 +314,12 @@
         <details key="documentation" value="If an element that is owned by a package has visibility, it is public or private.&#xD;&#xA;self.ownedElements->forAll(e | e.visibility->notEmpty() implies e.visbility = #public or e.visibility = #private)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedClass" ordered="false" lowerBound="1" eType="#//Class">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -476,21 +491,36 @@
         <details key="documentation" value="If there is no name, or one of the containing namespaces has no name, there is no qualified name.&#xD;&#xA;(self.name->isEmpty() or self.allNamespaces()->select(ns | ns.name->isEmpty())->notEmpty())&#xD;&#xA;  implies self.qualifiedName->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_qualified_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="When there is a name, and all of the containing namespaces have a name, the qualified name is constructed from the names of the containing namespaces.&#xD;&#xA;(self.name->notEmpty() and self.allNamespaces()->select(ns | ns.name->isEmpty())->isEmpty()) implies&#xA;  self.qualifiedName = self.allNamespaces()->iterate( ns : Namespace; result: String = self.name | ns.name->union(self.separator())->union(result))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility_needs_ownership" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a NamedElement is not owned by a Namespace, it does not have a visibility.&#xD;&#xA;namespace->isEmpty() implies visibility->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createDependency" ordered="false" lowerBound="1" eType="#//Dependency">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -667,7 +697,12 @@
         <details key="documentation" value="All the members of a Namespace are distinguishable within it.&#xD;&#xA;membersAreDistinguishable()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createElementImport" ordered="false" lowerBound="1" eType="#//ElementImport">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -777,14 +812,24 @@
         <details key="documentation" value="The visibility of an ElementImport is either public or private.&#xD;&#xA;self.visibility = #public or self.visibility = #private"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="imported_element_is_public" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An importedElement has either public visibility or no visibility at all.&#xD;&#xA;self.importedElement.visibility.notEmpty() implies self.importedElement.visibility = #public"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getName" ordered="false" lowerBound="1" eType="#//String">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -827,7 +872,12 @@
         <details key="documentation" value="The visibility of a PackageImport is either public or private.&#xD;&#xA;self.visibility = #public or self.visibility = #private"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="visibility" ordered="false"
         lowerBound="1" eType="#//VisibilityKind" defaultValueLiteral="public">
@@ -859,35 +909,60 @@
         <details key="documentation" value="A constraint cannot be applied to itself.&#xD;&#xA;not constrainedElement->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_boolean" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The value specification for a constraint must evaluate to a Boolean value.&#xD;&#xA;self.specification().booleanValue().isOclKindOf(Boolean)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="boolean_value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The value specification for a constraint must evaluate to a Boolean value.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_side_effects" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Evaluating the value specification for a constraint must not have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_applied_to_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A constraint cannot be applied to itself.&#xD;&#xA;not constrainedElement->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="constrainedElement" upperBound="-1"
         eType="#//Element">
@@ -1014,28 +1089,48 @@
         <details key="documentation" value="An association specializing another association has the same number of ends as the other association.&#xD;&#xA;self.parents()->forAll(p | p.memberEnd.size() = self.memberEnd.size())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="specialized_end_types" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="When an association specializes another association, every end of the specific association corresponds to an end of the general association, and the specific end reaches the same type or a subtype of the more general end.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binary_associations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only binary associations can be aggregations.&#xD;&#xA;self.memberEnd->exists(aggregation &lt;> Aggregation::none) implies self.memberEnd->size() = 2"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_ends" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Association ends of associations with more than two ends must be owned by the association.&#xD;&#xA;if memberEnd->size() > 2 then ownedEnd->includesAll(memberEnd)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isBinary" ordered="false" lowerBound="1" eType="#//Boolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -1116,28 +1211,48 @@
         <details key="documentation" value="Generalization hierarchies must be directed and acyclical. A classifier can not be both a transitively general and transitively specific classifier of the same classifier.&#xD;&#xA;not self.allParents()->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="generalization_hierarchies" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Generalization hierarchies must be directed and acyclical. A classifier can not be both a transitively general and transitively specific classifier of the same classifier.&#xD;&#xA;not self.allParents()->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="specialize_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A classifier may only specialize classifiers of a valid type.&#xD;&#xA;self.parents()->forAll(c | self.maySpecializeType(c))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maps_to_generalization_set" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The Classifier that maps to a GeneralizationSet may neither be a specific nor a general Classifier in any of the Generalization relationships defined for that GeneralizationSet. In other words, a power type may not be an instance of itself nor may its instances also be its subclasses.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getAllAttributes" ordered="false" upperBound="-1" eType="#//Property">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -1340,14 +1455,24 @@
         <details key="documentation" value="At least one of the redefinition contexts of the redefining element must be a specialization of at least one of the redefinition contexts for each redefined element.&#xD;&#xA;self.redefinedElement->forAll(e | self.isRedefinitionContextValid(e))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinition_consistent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A redefining element must be consistent with each redefined element.&#xD;&#xA;self.redefinedElement->forAll(re | re.isConsistentWith(self))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isConsistentWith" ordered="false" lowerBound="1" eType="#//Boolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -1424,14 +1549,24 @@
         <details key="documentation" value="Each parameter substitution must refer to a formal template parameter of the target template signature.&#xD;&#xA;parameterSubstitution->forAll(b | template.parameter->includes(b.formal))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_parameter_substitution" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A binding contains at most one parameter substitution for each formal template parameter of the target template signature.&#xD;&#xA;template.parameter->forAll(p | parameterSubstitution->select(b | b.formal = p)->size() &lt;= 1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signature" ordered="false"
         lowerBound="1" eType="#//TemplateSignature">
@@ -1465,7 +1600,12 @@
         <details key="documentation" value="Parameters must own the elements they parameter or those elements must be owned by the element being templated.&#xD;&#xA;templatedElement.ownedElement->includesAll(parameter.parameteredElement - parameter.ownedParameteredElement)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" lowerBound="1"
         upperBound="-1" eType="#//TemplateParameter">
@@ -1497,7 +1637,12 @@
         <details key="documentation" value="The default must be compatible with the formal template parameter.&#xD;&#xA;default->notEmpty() implies default->isCompatibleWith(parameteredElement)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signature" ordered="false"
         lowerBound="1" eType="#//TemplateSignature" eOpposite="#//TemplateSignature/ownedParameter">
@@ -1572,7 +1717,12 @@
         <details key="documentation" value="The actual parameter must be compatible with the formal template parameter, e.g. the actual parameter for a class template parameter must be a class.&#xD;&#xA;actual->forAll(a | a.isCompatibleWith(formal.parameteredElement))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="formal" ordered="false"
         lowerBound="1" eType="#//TemplateParameter">
@@ -1610,7 +1760,12 @@
         <details key="documentation" value="Every Generalization associated with a given GeneralizationSet must have the same general Classifier. That is, all Generalizations for a particular GeneralizationSet must have the same superclass.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubstitutable" ordered="false"
         eType="#//Boolean" unsettable="true">
@@ -1648,14 +1803,24 @@
         <details key="documentation" value="Every Generalization associated with a particular GeneralizationSet must have the same general Classifier.&#xD;&#xA;generalization->collect(g | g.general)->asSet()->size() &lt;= 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maps_to_generalization_set" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The Classifier that maps to a GeneralizationSet may neither be a specific nor a general Classifier in any of the Generalization relationships defined for that GeneralizationSet. In other words, a power type may not be an instance of itself nor may its instances be its subclasses.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isCovering" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -1752,21 +1917,36 @@
         <details key="documentation" value="If the language attribute is not empty, then the size of the body and language arrays must be the same.&#xD;&#xA;language->notEmpty() implies (body->size() = language->size())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="only_return_result_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The behavior may only have return result parameters.&#xD;&#xA;self.behavior.notEmpty() implies&#xD;&#xA;  self.behavior.ownedParameters->select(p | p.direction&lt;>#return)->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_return_result_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The behavior must have exactly one return result parameter.&#xD;&#xA;self.behavior.notEmpty() implies&#xD;&#xA;  self.behavior.ownedParameter->select(p | p.direction=#return)->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getResult" ordered="false" eType="#//Parameter"/>
     <eOperations name="value" ordered="false" lowerBound="1" eType="#//Integer">
@@ -1826,35 +2006,60 @@
         <details key="documentation" value="A parameter may only be associated with a connector end within the context of a collaboration.&#xD;&#xA;self.end.notEmpty() implies self.collaboration.notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="stream_and_exception" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A parameter cannot be a stream and exception at the same time.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_exception" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An input parameter cannot be an exception.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="reentrant_behaviors" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Reentrant behaviors cannot have stream parameters.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="in_and_out" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only in and inout parameters may have a delete effect. Only out, inout, and return parameters may have a create effect.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefault" ordered="false" eType="#//String"/>
     <eOperations name="isSetDefault" ordered="false" lowerBound="1" eType="#//Boolean"/>
@@ -1952,35 +2157,60 @@
         <details key="documentation" value="A multiplicity must define at least one valid cardinality that is greater than zero.&#xD;&#xA;upperBound()->notEmpty() implies upperBound() > 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="lower_ge_0" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The lower bound must be a non-negative integer literal.&#xD;&#xA;lowerBound()->notEmpty() implies lowerBound() >= 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="upper_ge_lower" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The upper bound must be greater than or equal to the lower bound.&#xD;&#xA;(upperBound()->notEmpty() and lowerBound()->notEmpty()) implies upperBound() >= lowerBound()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_no_side_effects" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a non-literal ValueSpecification is used for the lower or upper bound, then evaluating that specification must not have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_constant" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a non-literal ValueSpecification is used for the lower or upper bound, then that specification must be a constant expression.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="setLower" ordered="false" lowerBound="1">
       <eParameters name="newLower" ordered="false" lowerBound="1" eType="#//Integer"/>
@@ -2109,28 +2339,48 @@
         <details key="documentation" value="The multiplicity of the connector end may not be more general than the multiplicity of the association typing the owning connector.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="part_with_port_empty" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a connector end is attached to a port of the containing classifier, partWithPort will be empty.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="role_and_part_with_port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a connector end references both a role and a partWithPort, then the role must be a port that is defined by the type of the partWithPort.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="self_part_with_port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The property held in self.partWithPort must not be a Port.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefiningEnd" ordered="false" lowerBound="1" eType="#//Property"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="definingEnd" ordered="false"
@@ -2186,70 +2436,120 @@
         <details key="documentation" value="A multiplicity of a composite aggregation must not have an upper bound greater than 1.&#xD;&#xA;A multiplicity on an aggregate end of a composite aggregation must not have an upper bound greater than 1.&#xD;&#xA;isComposite implies (upperBound()->isEmpty() or upperBound() &lt;= 1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetting_context_conforms" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Subsetting may only occur when the context of the subsetting property conforms to the context of the subsetted property.&#xD;&#xA;self.subsettedProperty->notEmpty() implies&#xA;  (self.subsettingContext()->notEmpty() and self.subsettingContext()->forAll (sc |&#xA;    self.subsettedProperty->forAll(sp |&#xA;      sp.subsettingContext()->exists(c | sc.conformsTo(c)))))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefined_property_inherited" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A redefined property must be inherited from a more general classifier containing the redefining property.&#xD;&#xA;if (redefinedProperty->notEmpty()) then&#xD;&#xA;  (redefinitionContext->notEmpty() and&#xD;&#xA;      redefinedProperty->forAll(rp|&#xD;&#xA;        ((redefinitionContext->collect(fc|&#xD;&#xA;          fc.allParents()))->asSet())->collect(c| c.allFeatures())->asSet()->includes(rp))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetting_rules" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A subsetting property may strengthen the type of the subsetted property, and its upper bound may be less.&#xD;&#xA;self.subsettedProperty->forAll(sp |&#xA;  self.type.conformsTo(sp.type) and&#xA;    ((self.upperBound()->notEmpty() and sp.upperBound()->notEmpty()) implies&#xA;      self.upperBound()&lt;=sp.upperBound() ))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="navigable_readonly" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only a navigable property can be marked as readOnly.&#xD;&#xA;isReadOnly implies isNavigable()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="derived_union_is_derived" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A derived union is derived.&#xD;&#xA;isDerivedUnion implies isDerived"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="derived_union_is_read_only" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A derived union is read only.&#xD;&#xA;isDerivedUnion implies isReadOnly"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetted_property_names" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A property may not subset a property with the same name.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A Property can be a DeploymentTarget if it is a kind of Node and functions as a part in the internal structure of an encompassing Node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binding_to_attribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A binding of a property template parameter representing an attribute must be to an attribute.&#xD;&#xA;(isAttribute(self) and (templateParameterSubstitution->notEmpty())&#xD;&#xA;  implies (templateParameterSubstitution->forAll(ts | isAttribute(ts.formal)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefault" ordered="false" eType="#//String"/>
     <eOperations name="isSetDefault" ordered="false" lowerBound="1" eType="#//Boolean"/>
@@ -2492,14 +2792,24 @@
         <details key="documentation" value="The deployedElements of a DeploymentTarget that are involved in a Deployment that has an associated Deployment-Specification is a kind of Component (i.e. the configured components).&#xD;&#xA;self.deployment->forAll (d | d.location.deployedElements->forAll (de |&#xD;&#xA;  de.oclIsKindOf(Component)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The DeploymentTarget of a DeploymentSpecification is a kind of ExecutionEnvironment.&#xD;&#xA;result = self.deployment->forAll (d | d.location..oclIsKindOf(ExecutionEnvironment))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="deploymentLocation" ordered="false"
         eType="#//String" unsettable="true">
@@ -2629,14 +2939,24 @@
         <details key="documentation" value="An operation can have at most one return parameter; i.e., an owned parameter with the direction set to 'return'&#xD;&#xA;self.ownedParameter->select(par | par.direction = #return)->size() &lt;= 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="only_body_for_query" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A bodyCondition can only be specified for a query operation.&#xD;&#xA;bodyCondition->notEmpty() implies isQuery"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getLower" ordered="false" lowerBound="1" eType="#//Integer"/>
     <eOperations name="getUpper" ordered="false" lowerBound="1" eType="#//UnlimitedNatural"/>
@@ -2850,28 +3170,48 @@
         <details key="documentation" value="The parameters of the behavior must match the parameters of the implemented behavioral feature.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="feature_of_context_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The implemented behavioral feature must be a feature (possibly inherited) of the context classifier of the behavior.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_realize" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the implemented behavioral feature has been redefined in the ancestors of the owner of the behavior, then the behavior must realize the latest redefining behavioral feature.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="most_one_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="There may be at most one behavior for a given pairing of classifier (as owner of the behavior) and behavioral feature (as specification of the behavior).&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getContext" ordered="false" eType="#//BehavioredClassifier"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReentrant" ordered="false"
@@ -2962,7 +3302,12 @@
         <details key="documentation" value="A passive class may not own receptions.&#xD;&#xA;not self.isActive implies self.ownedReception.isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getExtensions" ordered="false" upperBound="-1" eType="#//Extension"/>
     <eOperations name="createOwnedOperation" ordered="false" lowerBound="1" eType="#//Operation">
@@ -3031,7 +3376,12 @@
         <details key="documentation" value="If a behavior is classifier behavior, it does not have a specification.&#xD;&#xA;self.classifierBehavior.notEmpty() implies self.specification.isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getImplementedInterfaces" ordered="false" upperBound="-1" eType="#//Interface">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3101,7 +3451,12 @@
         <details key="documentation" value="The visibility of all features owned by an interface must be public.&#xD;&#xA;self.feature->forAll(f | f.visibility = #public)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedOperation" ordered="false" lowerBound="1" eType="#//Operation">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3173,7 +3528,12 @@
         <details key="documentation" value="A Reception can not be a query.&#xD;&#xA;not self.isQuery"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signal" ordered="false"
         eType="#//Signal">
@@ -3214,7 +3574,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//StateMachine/classifier_context"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="protocol_transitions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
@@ -3222,28 +3587,48 @@
         <details key="documentation" value="All transitions of a protocol state machine must be protocol transitions. (transitions as extended by the ProtocolStateMachines package)&#xD;&#xA;region->forAll(r | r.transition->forAll(t | t.oclIsTypeOf(ProtocolTransition)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="entry_exit_do" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The states of a protocol state machine cannot have entry, exit, or do activity actions.&#xD;&#xA;region->forAll(r | r.subvertex->forAll(v | v.oclIsKindOf(State) implies&#xA;(v.entry->isEmpty() and v.exit->isEmpty() and v.doActivity->isEmpty())))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deep_or_shallow_history" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Protocol state machines cannot have deep or shallow history pseudostates.&#xD;&#xA;region->forAll (r | r.subvertex->forAll (v | v.oclIsKindOf(Psuedostate) implies&#xA;((v.kind &lt;> #deepHistory) and (v.kind &lt;> #shallowHistory)))))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ports_connected" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If two ports are connected, then the protocol state machine of the required interface (if defined) must be conformant to the protocol state machine of the provided interface (if defined).&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="conformance" ordered="false"
         upperBound="-1" eType="#//ProtocolConformance" containment="true" eOpposite="#//ProtocolConformance/specificMachine">
@@ -3272,28 +3657,48 @@
         <details key="documentation" value="The classifier context of a state machine cannot be an interface.&#xD;&#xA;context->notEmpty() implies not context.oclIsKindOf(Interface)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="context_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The context classifier of the method state machine of a behavioral feature must be the classifier that owns the behavioral feature.&#xD;&#xA;specification->notEmpty() implies (context->notEmpty() and specification->featuringClassifier->exists (c | c = context))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="connection_points" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The connection points of a state machine are pseudostates of kind entry point or exit point.&#xD;&#xA;conectionPoint->forAll (c | c.kind = #entryPoint or c.kind = #exitPoint)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="method" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A state machine as the method for a behavioral feature cannot have entry/exit connection points.&#xD;&#xA;specification->notEmpty() implies connectionPoint->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="LCA" ordered="false" lowerBound="1" eType="#//Namespace">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3372,28 +3777,48 @@
         <details key="documentation" value="A region can have at most one initial vertex&#xD;&#xA;self.subvertex->select (v | v.oclIsKindOf(Pseudostate))->&#xA;select(p : Pseudostate | p.kind = #initial)->size() &lt;= 1&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deep_history_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A region can have at most one deep history vertex&#xD;&#xA;self.subvertex->select (v | v.oclIsKindOf(Pseudostate))->&#xA;select(p : Pseudostate | p.kind = #deepHistory)->size() &lt;= 1&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="shallow_history_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A region can have at most one shallow history vertex&#xD;&#xA;self.subvertex->select(v | v.oclIsKindOf(Pseudostate))->&#xA;select(p : Pseudostate | p.kind = #shallowHistory)->size() &lt;= 1&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a Region is owned by a StateMachine, then it cannot also be owned by a State and vice versa.&#xD;&#xA;(stateMachine->notEmpty() implies state->isEmpty()) and (state->notEmpty() implies stateMachine->isEmpty())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinitionContext" ordered="false" lowerBound="1" eType="#//Classifier">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3510,49 +3935,84 @@
         <details key="documentation" value="A fork segment must not have guards or triggers.&#xD;&#xA;(source.oclIsKindOf(Pseudostate) and source.kind = #fork) implies (guard->isEmpty() and trigger->isEmpty())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_segment_guards" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A join segment must not have guards or triggers.&#xD;&#xA;(target.oclIsKindOf(Pseudostate) and target.kind = #join) implies (guard->isEmpty() and trigger->isEmpty())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="fork_segment_state" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A fork segment must always target a state.&#xD;&#xA;(source.oclIsKindOf(Pseudostate) and source.kind = #fork) implies (target.oclIsKindOf(State))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_segment_state" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A join segment must always originate from a state.&#xD;&#xA;(target.oclIsKindOf(Pseudostate) and target.kind = #join) implies (source.oclIsKindOf(State))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="outgoing_pseudostates" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Transitions outgoing pseudostates may not have a trigger.&#xD;&#xA;source.oclIsKindOf(Pseudostate) and&#xA;((source.kind &lt;> #junction) and (source.kind &lt;> #join) and (source.kind &lt;> #initial)) implies trigger->isEmpty()&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="initial_transition" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An initial transition at the topmost level (region of a statemachine) either has no trigger or it has a trigger with the stereotype &lt;&lt;create>>.&#xD;&#xA;self.source.oclIsKindOf(Pseudostate) implies&#xA;(self.source.oclAsType(Pseudostate).kind = #initial) implies&#xA;(self.source.container = self.stateMachine.top) implies&#xA;((self.trigger->isEmpty) or&#xA;(self.trigger.stereotype.name = 'create'))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signatures_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In case of more than one trigger, the signatures of these must be compatible in case the parameters of the signal are assigned to local variables/attributes.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinitionContext" ordered="false" lowerBound="1" eType="#//Classifier">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3671,28 +4131,48 @@
         <details key="documentation" value="The required interfaces of a port must be provided by elements to which the port is connected.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="port_aggregation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Port.aggregation must be composite.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="port_destroyed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="When a port is destroyed, all connectors attached to this port will be destroyed also.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="default_value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A defaultValue for port cannot be specified when the type of the Port is an Interface&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getProvideds" ordered="false" upperBound="-1" eType="#//Interface"/>
     <eOperations name="getRequireds" ordered="false" upperBound="-1" eType="#//Interface"/>
@@ -3770,35 +4250,60 @@
         <details key="documentation" value="Only submachine states can have connection point references.&#xD;&#xA;isSubmachineState implies connection->notEmpty ( )"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="destinations_or_sources_of_transitions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The connection point references used as destinations/sources of transitions associated with a submachine state must be defined as entry/exit points in the submachine state machine.&#xD;&#xA;self.isSubmachineState implies (self.connection->forAll (cp |&#xD;&#xA;cp.entry->forAll (p | p.statemachine = self.submachine) and&#xD;&#xA;cp.exit->forAll (p | p.statemachine = self.submachine)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="submachine_or_regions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A state is not allowed to have both a submachine and regions.&#xD;&#xA;isComposite implies not isSubmachineState"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="composite_states" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only composite states can have entry or exit pseudostates defined.&#xD;&#xA;connectionPoint->notEmpty() implies isComoposite"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="entry_or_exit" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only entry or exit pseudostates can serve as connection points.&#xD;&#xA;connectionPoint->forAll(cp|cp.kind = #entry or cp.kind = #exit)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isSimple" ordered="false" lowerBound="1" eType="#//Boolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -3939,14 +4444,24 @@
         <details key="documentation" value="The entry Pseudostates must be Pseudostates with kind entryPoint.&#xD;&#xA;entry->notEmpty() implies entry->forAll(e | e.kind = #entryPoint)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="exit_pseudostates" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The exit Pseudostates must be Pseudostates with kind exitPoint.&#xD;&#xA;exit->notEmpty() implies exit->forAll(e | e.kind = #exitPoint)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="entry" ordered="false"
         upperBound="-1" eType="#//Pseudostate">
@@ -3977,63 +4492,108 @@
         <details key="documentation" value="An initial vertex can have at most one outgoing transition.&#xD;&#xA;(self.kind = #initial) implies (self.outgoing->size &lt;= 1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="history_vertices" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="History vertices can have at most one outgoing transition.&#xD;&#xA;((self.kind = #deepHistory) or (self.kind = #shallowHistory)) implies&#xA;(self.outgoing->size &lt;= 1)&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In a complete statemachine, a join vertex must have at least two incoming transitions and exactly one outgoing transition.&#xD;&#xA;(self.kind = #join) implies&#xA;((self.outgoing->size = 1) and (self.incoming->size >= 2))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transitions_incoming" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="All transitions incoming a join vertex must originate in different regions of an orthogonal state.&#xD;&#xA;(self.kind = #join) implies&#xA;  self.incoming->forAll (t1, t2 | t1&lt;>t2 implies&#xA;    (self.stateMachine.LCA(t1.source, t2.source).container.isOrthogonal))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="fork_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In a complete statemachine, a fork vertex must have at least two outgoing transitions and exactly one incoming transition.&#xD;&#xA;(self.kind = #fork) implies&#xA;((self.incoming->size = 1) and (self.outgoing->size >= 2))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transitions_outgoing" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="All transitions outgoing a fork vertex must target states in different regions of an orthogonal state.&#xD;&#xA;(self.kind = #fork) implies&#xA;  self.outgoing->forAll (t1, t2 | t1&lt;>t2 implies&#xA;    (self.stateMachine.LCA(t1.target, t2.target).container.isOrthogonal))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="junction_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In a complete statemachine, a junction vertex must have at least one incoming and one outgoing transition.&#xD;&#xA;(self.kind = #junction) implies&#xA;((self.incoming->size >= 1) and (self.outgoing->size >= 1))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="choice_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In a complete statemachine, a choice vertex must have at least one incoming and one outgoing transition.&#xD;&#xA;(self.kind = #choice) implies&#xA;((self.incoming->size >= 1) and (self.outgoing->size >= 1))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="outgoing_from_initial" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The outgoing transition from and initial vertex may have a behavior, but not a trigger or a guard.&#xD;&#xA;(self.kind = #initial) implies (self.outgoing.guard->isEmpty()&#xD;&#xA;  and self.outgoing.trigger->isEmpty())"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" ordered="false" lowerBound="1"
         eType="#//PseudostateKind" defaultValueLiteral="initial">
@@ -4153,7 +4713,12 @@
         <details key="documentation" value="The multiplicities on connected elements must be consistent.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedAttribute" ordered="false" lowerBound="1" eType="#//Property">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4203,56 +4768,96 @@
         <details key="documentation" value="The types of the connectable elements that the ends of a connector are attached to must conform to the types of the association ends of the association that types the connector, if any.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The connectable elements attached to the ends of a connector must be compatible.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="roles" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The ConnectableElements attached as roles to each ConnectorEnd owned by a Connector must be roles of the Classifier that owned the Connector, or they must be ports of such roles.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interfaces_ports" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A delegation connector must only be defined between used Interfaces or Ports of the same kind, e.g. between two provided Ports or between two required Ports.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interface_port_implements" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a delegation connector is defined between a used Interface or Port and an internal Part Classifier, then that Classifier must have an 'implements' relationship to the Interface type of that Port.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interface_port_signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a delegation connector is defined between a source Interface or Port and a target Interface or Port, then the target Interface must support a signature compatible subset of Operations of the source Interface or Port.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="union_signature_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In a complete model, if a source Port has delegation connectors to a set of delegated target Ports, then the union of the Interfaces of these target Ports must be signature compatible with the Interface that types the source Port.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="assembly_connector" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An assembly connector must only be defined from a required Interface or Ports to a provided Interface or Port.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" eType="#//Association">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4319,14 +4924,24 @@
         <details key="documentation" value="The non-owned end of an Extension is typed by a Class.&#xD;&#xA;metaclassEnd()->notEmpty() and metaclass()->oclIsKindOf(Class)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="is_binary" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An Extension is binary, i.e., it has only two memberEnds.&#xD;&#xA;memberEnd->size() = 2"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getStereotypeEnd" ordered="false" eType="#//Property">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4407,14 +5022,24 @@
         <details key="documentation" value="The multiplicity of ExtensionEnd is 0..1 or 1.&#xD;&#xA;(self->lowerBound() = 0 or self->lowerBound() = 1) and self->upperBound() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="aggregation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The aggregation of an ExtensionEnd is composite.&#xD;&#xA;self.aggregation = #composite"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Stereotype" eSuperTypes="#//Class">
@@ -4426,14 +5051,24 @@
         <details key="documentation" value="Stereotype names should not clash with keyword names for the extended model element.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="generalize" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A Stereotype may only generalize or specialize another Stereotype.&#xD;&#xA;generalization.general->forAll(e |e.oclIsKindOf(Stereotype)) and generalization.specific->forAll(e | e.oclIsKindOf(Stereotype)) "/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createExtension" ordered="false" lowerBound="1" eType="#//Extension">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4526,14 +5161,24 @@
         <details key="documentation" value="An element imported as a metaclassReference is not specialized or generalized in a Profile.&#xD;&#xA;self.metaclassReference.importedElement->&#xD;&#xA;  select(c | c.oclIsKindOf(Classifier) and&#xD;&#xA;    (c.generalization.namespace = self or&#xD;&#xA;      (c.specialization.namespace = self) )->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="references_same_metamodel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="All elements imported either as metaclassReferences or through metamodelReferences are members of the same base reference metamodel.&#xD;&#xA;self.metamodelReference.importedPackage.elementImport.importedElement.allOwningPackages())->&#xD;&#xA;  union(self.metaclassReference.importedElement.allOwningPackages() )->notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="create" ordered="false" lowerBound="1" eType="ecore:EClass ../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EObject">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4632,21 +5277,36 @@
         <details key="documentation" value="The parameters in a parameter set must all be inputs or all be outputs of the same parameterized entity, and the parameter set is owned by that entity.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a behavior has input parameters that are in a parameter set, then any inputs that are not in a parameter set must be streaming. Same for output parameters.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="two_parameter_sets" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Two parameter sets cannot have exactly the same set of parameters.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" ordered="false"
         lowerBound="1" upperBound="-1" eType="#//Parameter" eOpposite="#//Parameter/parameterSet">
@@ -4848,21 +5508,36 @@
         <details key="documentation" value="All the client elements of a roleBinding are in one classifier and all supplier elements of a roleBinding are in one collaboration and they are compatible.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="every_role" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Every role in the collaboration is bound within the collaboration use to a connectable element within the classifier or operation.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="connectors" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The connectors in the classifier connect according to the connectors in the collaboration&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1"
         eType="#//Collaboration">
@@ -4899,28 +5574,48 @@
         <details key="documentation" value="A UseCase must have a name.&#xD;&#xA;self.name -> notEmpty ()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binary_associations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="UseCases can only be involved in binary Associations.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_association_to_use_case" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="UseCases can not have Associations to UseCases specifying the same subject.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_include_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A use case cannot include use cases that directly or indirectly include it.&#xD;&#xA;not self.allIncludedUseCases()->includes(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="allIncludedUseCases" ordered="false" upperBound="-1" eType="#//UseCase">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4983,7 +5678,12 @@
         <details key="documentation" value="The extension points referenced by the extend relationship must belong to the use case that is being extended.&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;extensionLocation->forAll (xp | extendedCase.extensionPoint->includes(xp))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="extendedCase" ordered="false"
         lowerBound="1" eType="#//UseCase">
@@ -5022,7 +5722,12 @@
         <details key="documentation" value="An ExtensionPoint must have a name.&#xD;&#xA;self.name->notEmpty ()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="useCase" ordered="false"
         lowerBound="1" eType="#//UseCase" eOpposite="#//UseCase/extensionPoint">
@@ -5050,7 +5755,12 @@
         <details key="documentation" value="The inherited parameters are the parameters of the extended template signature.&#xD;&#xA;if extendedSignature->isEmpty() then Set{} else extendedSignature.parameter endif"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getInheritedParameters" ordered="false" upperBound="-1" eType="#//TemplateParameter"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="extendedSignature" ordered="false"
@@ -5094,7 +5804,12 @@
         <details key="documentation" value="If &quot;allowSubstitutable&quot; is true, then there must be a constrainingClassifier.&#xD;&#xA;allowSubstitutable implies constrainingClassifier->notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="allowSubstitutable" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true">
@@ -5133,14 +5848,24 @@
         <details key="documentation" value="All the operands of a StringExpression must be LiteralStrings&#xD;&#xA;operand->forAll (op | op.oclIsKindOf (LiteralString))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subexpressions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a StringExpression has sub-expressions, it cannot have operands and vice versa (this avoids the problem of having to&#xA;define a collating sequence between operands and subexpressions).&#xA;&#xD;&#xA;if subExpression->notEmpty() then operand->isEmpty() else operand->notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="subExpression" ordered="false"
         upperBound="-1" eType="#//StringExpression" containment="true" eOpposite="#//StringExpression/owningExpression">
@@ -5263,28 +5988,48 @@
         <details key="documentation" value="The defining feature of each slot is a structural feature (directly or inherited) of a classifier of the instance specification.&#xD;&#xA;slot->forAll(s | classifier->exists (c | c.allFeatures()->includes (s.definingFeature)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structural_feature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="One structural feature (including the same feature inherited from multiple classifiers) is the defining feature of at most one slot in an instance specification.&#xD;&#xA;classifier->forAll(c | (c.allFeatures()->forAll(f | slot->select(s | s.definingFeature = f)->size() &lt;= 1)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An InstanceSpecification can be a DeploymentTarget if it is the instance specification of a Node and functions as a part in the internal structure of an encompassing Node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_artifact" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An InstanceSpecification can be a DeployedArtifact if it is the instance specification of an Artifact.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="classifier" ordered="false"
         upperBound="-1" eType="#//Classifier">
@@ -5538,14 +6283,24 @@
         <details key="documentation" value="A function behavior has at least one output parameter.&#xD;&#xA;self.ownedParameters->&#xD;&#xA;  select(p | p.direction=#out or p.direction=#inout or p.direction=#return)->size() >= 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="types_of_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The types of parameters are all data types, which may not nest anything but other datatypes.&#xD;&#xA;def: hasAllDataTypeAttributes(d : DataType) : Boolean =&#xD;&#xA;  d.ownedAttribute->forAll(a |&#xD;&#xA;    a.type.oclIsTypeOf(DataType) and&#xD;&#xA;      hasAllDataTypeAttributes(a.type))&#xD;&#xA;self.ownedParameters->forAll(p | p.type.notEmpty() and&#xD;&#xA;  p.oclIsTypeOf(DataType) and hasAllDataTypeAttributes(p))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="OpaqueAction" eSuperTypes="#//Action">
@@ -5645,14 +6400,24 @@
         <details key="documentation" value="Activity nodes may be owned by at most one structured node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Activity nodes can only be owned by activities or groups.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="inStructuredNode" ordered="false"
         eType="#//StructuredActivityNode" eOpposite="#//StructuredActivityNode/node">
@@ -5728,7 +6493,12 @@
         <details key="documentation" value="The edges owned by a structured node must have source and target nodes in the structured node, and vice versa.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false"
         upperBound="-1" eType="#//Variable" containment="true" eOpposite="#//Variable/scope">
@@ -5767,21 +6537,36 @@
         <details key="documentation" value="All nodes and edges of the group must be in the same activity as the group.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="No node or edge in a group may be contained by its subgroups or its containing groups, transitively.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="group_owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Groups may only be owned by activities or groups.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="subgroup" ordered="false"
         upperBound="-1" eType="#//ActivityGroup" changeable="false" volatile="true"
@@ -5834,21 +6619,36 @@
         <details key="documentation" value="The groups of an activity have no supergroups.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="activity_parameter_node" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The nodes of the activity must include one ActivityParameterNode for each parameter.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="autonomous" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An activity cannot be autonomous and have a classifier or behavioral feature context at the same time.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="structuredNode" ordered="false"
         upperBound="-1" eType="#//StructuredActivityNode" changeable="false" volatile="true"
@@ -5915,7 +6715,12 @@
         <details key="documentation" value="A variable is owned by a StructuredNode or Activity, but not both.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isAccessibleBy" ordered="false" lowerBound="1" eType="#//Boolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -5947,21 +6752,36 @@
         <details key="documentation" value="The source and target of an edge must be in the same activity as the edge.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Activity edges may be owned only by activities or groups.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structured_node" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Activity edges may be owned by at most one structured node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="source" ordered="false"
         lowerBound="1" eType="#//ActivityNode" eOpposite="#//ActivityNode/outgoing">
@@ -6041,28 +6861,48 @@
         <details key="documentation" value="A partition with isDimension = true may not be contained by another partition.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_part" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a partition represents a part, then all the non-external partitions in the same dimension and at the same level of nesting in that dimension must represent parts directly contained in the internal structure of the same classifier.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a non-external partition represents a classifier and is contained in another partition, then the containing partition must represent a classifier, and the classifier of the subpartition must be nested in the classifier represented by the containing partition, or be at the contained end of a strong composition association with the classifier represented by the containing partition.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_part_and_is_contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a partition represents a part and is contained by another partition, then the part must be of a classifier represented by the containing partition, or of a classifier that is the type of a part representing the containing partition.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDimension" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -6120,7 +6960,12 @@
         <details key="documentation" value="Interrupting edges of a region must have their source node in the region and their target node outside the region in the same activity containing the region.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="node" ordered="false" upperBound="-1"
         eType="#//ActivityNode" eOpposite="#//ActivityNode/inInterruptibleRegion">
@@ -6145,28 +6990,48 @@
         <details key="documentation" value="The exception handler and its input object node are not the source or target of any edge.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The result pins of the exception handler body must correspond in number and types to the result pins of the protected node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_input" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The handler body has one input, and that input is the same as the exception input.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edge_source_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An edge that has a source in an exception handler structured node must have its target in the handler also, and vice versa.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="handlerBody" ordered="false"
         lowerBound="1" eType="#//ExecutableNode">
@@ -6203,28 +7068,48 @@
         <details key="documentation" value="All edges coming into or going out of object nodes must be object flow edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_unique" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Object nodes are not unique typed elements&#xD;&#xA;isUnique = false"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selection_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If an object node has a selection behavior, then the ordering of the object node is ordered, and vice versa.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_output_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A selection behavior has one input parameter and one output parameter. The input parameter must be a bag of elements of the same type as the object node or a supertype of the type of object node. The output parameter must be the same or a subtype of the type of object node. The behavior cannot have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="ordering" ordered="false"
         lowerBound="1" eType="#//ObjectNodeOrderingKind" defaultValueLiteral="FIFO">
@@ -6292,7 +7177,12 @@
         <details key="documentation" value="Output pins may have incoming edges only when they are on actions that are structured nodes, and these edges may not target a node contained by the structured node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Pin" eSuperTypes="#//ObjectNode #//MultiplicityElement">
@@ -6304,7 +7194,12 @@
         <details key="documentation" value="Control pins have a control type&#xD;&#xA;isControl implies isControlType"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isControl" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -6322,7 +7217,12 @@
         <details key="documentation" value="Input pins may have outgoing edges only when they are on actions that are structured nodes, and these edges must target a node contained by the structured node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CallAction" abstract="true" eSuperTypes="#//InvocationAction">
@@ -6334,21 +7234,36 @@
         <details key="documentation" value="Only synchronous call actions can have result pins.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="number_and_order" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The number and order of argument pins must be the same as the number and order of parameters of the invoked behavior or behavioral feature. Pins are matched to parameters by order.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type, ordering, and multiplicity of an argument pin must be the same as the corresponding parameter of the behavior or behavioral feature.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronous" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true">
@@ -6373,7 +7288,12 @@
         <details key="documentation" value="The onPort must be a port on the receiver object.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="argument" upperBound="-1"
         eType="#//InputPin" containment="true">
@@ -6398,14 +7318,24 @@
         <details key="documentation" value="The number and order of argument pins must be the same as the number and order of attributes in the signal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type, ordering, and multiplicity of an argument pin must be the same as the corresponding attribute of the signal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="target" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -6432,7 +7362,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//CallAction/type_ordering_multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="argument_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
@@ -6440,21 +7375,36 @@
         <details key="documentation" value="The number of argument pins and the number of owned parameters of the operation of type in and in-out must be equal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The number of result pins and the number of owned parameters of the operation of type return, out, and in-out must be equal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_target_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the target pin must be the same as the type that owns the operation.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="operation" ordered="false"
         lowerBound="1" eType="#//Operation">
@@ -6481,7 +7431,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//CallAction/type_ordering_multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="argument_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
@@ -6489,14 +7444,24 @@
         <details key="documentation" value="The number of argument pins and the number of parameters of the behavior of type in and in-out must be equal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The number of result pins and the number of parameters of the behavior of type return, out, and in-out must be equal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" ordered="false"
         lowerBound="1" eType="#//Behavior">
@@ -6536,7 +7501,12 @@
         <details key="documentation" value="Control flows may not have object nodes at either end, except for object nodes with control type.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InitialNode" eSuperTypes="#//ControlNode">
@@ -6548,14 +7518,24 @@
         <details key="documentation" value="An initial node has no incoming edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="control_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Only control edges can have initial nodes as source.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ActivityParameterNode" eSuperTypes="#//ObjectNode">
@@ -6567,35 +7547,60 @@
         <details key="documentation" value="Activity parameter nodes must have parameters from the containing activity.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of an activity parameter node is the same as the type of its parameter.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An activity parameter node may have all incoming edges or all outgoing edges, but it must not have both incoming and outgoing edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_incoming_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Activity parameter object nodes with no incoming edges and one or more outgoing edges must have a parameter with in or inout direction.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_outgoing_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Activity parameter object nodes with no outgoing edges and one or more incoming edges must have a parameter with out, inout, or return direction.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" ordered="false"
         lowerBound="1" eType="#//Parameter">
@@ -6613,14 +7618,24 @@
         <details key="documentation" value="The type of value specification must be compatible with the type of the value pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_incoming_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Value pins have no incoming edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//ValueSpecification" containment="true">
@@ -6638,49 +7653,84 @@
         <details key="documentation" value="If the sending MessageEvent and the receiving MessageEvent of the same Message are on the same Lifeline, the sending MessageEvent must be ordered before the receiving MessageEvent.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_refer_to" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The signature must either refer an Operation (in which case messageSort is either synchCall or asynchCall) or a Signal (in which case messageSort is asynchSignal). The name of the NamedElement referenced by signature must be the same as that of the Message.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_is_operation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In the case when the Message signature is an Operation, the arguments of the Message must correspond to the parameters of the Operation. A Parameter corresponds to an Argument if the Argument is of the same Class or a specialization of that of the Parameter.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_is_signal" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="In the case when the Message signature is a Signal, the arguments of the Message must correspond to the attributes of the Signal. A Message Argument corresponds to a Signal Attribute if the Arguement is of the same Class or a specialization of that of the Attribute.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Arguments of a Message must only be:&#xA;i) attributes of the sending lifeline&#xA;ii) constants&#xA;iii) symbolic values (which are wildcard values representing any legal value)&#xA;iv) explicit parameters of the enclosing Interaction&#xA;v) attributes of the class owning the Interaction&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_cross_boundaries" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Messages cannot cross bounderies of CombinedFragments or their operands.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="occurrence_specifications" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the MessageEnds are both OccurrenceSpecifications then the connector must go between the Parts represented by the Lifelines of the two MessageEnds.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getMessageKind" ordered="false" lowerBound="1" eType="#//MessageKind"/>
     <eOperations name="getSignature" ordered="false" eType="#//NamedElement"/>
@@ -6889,21 +7939,36 @@
         <details key="documentation" value="If two (or more) InteractionUses within one Interaction, refer to Interactions with 'common Lifelines,' those Lifelines must also appear in the Interaction with the InteractionUses. By common Lifelines we mean Lifelines with the same selector and represents associations.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selector_specified" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The selector for a Lifeline must only be specified if the referenced Part is multivalued.&#xD;&#xA;(self.selector->isEmpty() implies not self.represents.isMultivalued()) or&#xA;(not self.selector->isEmpty() implies self.represents.isMultivalued())&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The classifier containing the referenced ConnectableElement must be the same classifier, or an ancestor, of the classifier that contains the interaction enclosing this lifeline.&#xD;&#xA;if (represents->notEmpty()) then&#xA;(if selector->notEmpty() then represents.isMultivalued() else not represents.isMultivalued())&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="represents" ordered="false"
         eType="#//ConnectableElement">
@@ -6947,21 +8012,36 @@
         <details key="documentation" value="PartDecompositions apply only to Parts that are Parts of Internal Structures not to Parts of Collaborations.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="assume" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Assume that within Interaction X, Lifeline L is of class C and decomposed to D. Within X there is a sequence of constructs along L (such constructs are CombinedFragments, InteractionUse and (plain) OccurrenceSpecifications). Then a corresponding sequence of constructs must appear within D, matched one-to-one in the same order.&#xD;&#xA;&#xD;&#xA;i) CombinedFragment covering L are matched with an extra-global CombinedFragment in D&#xD;&#xA;ii) An InteractionUse covering L are matched with a global (i.e. covering all Lifelines) InteractionUse in D.&#xD;&#xA;iii) A plain OccurrenceSpecification on L is considered an actualGate that must be matched by a formalGate of D&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="commutativity_of_decomposition" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Assume that within Interaction X, Lifeline L is of class C and decomposed to D. Assume also that there is within X an&#xD;&#xA;InteractionUse (say) U that covers L. According to the constraint above U will have a counterpart CU within D. Within the Interaction referenced by U, L should also be decomposed, and the decomposition should reference CU. (This rule is called commutativity of decomposition)&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InteractionUse" eSuperTypes="#//InteractionFragment">
@@ -6973,28 +8053,48 @@
         <details key="documentation" value="Actual Gates of the InteractionUse must match Formal Gates of the referred Interaction. Gates match when their names are equal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="all_lifelines" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The InteractionUse must cover all Lifelines of the enclosing Interaction which appear within the referred Interaction.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments_correspond_to_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The arguments of the InteractionUse must correspond to parameters of the referred Interaction&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments_are_constants" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The arguments must only be constants, parameters of the enclosing Interaction or attributes of the classifier owning the enclosing Interaction.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="refersTo" ordered="false"
         lowerBound="1" eType="#//Interaction">
@@ -7025,14 +8125,24 @@
         <details key="documentation" value="The message leading to/from an actualGate of an InteractionUse must correspond to the message leading from/to the formalGate with the same name of the Interaction referenced by the InteractionUse.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="messages_combined_fragment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The message leading to/from an (expression) Gate within a CombinedFragment must correspond to the message leading from/to the CombinedFragment on its outside.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="GeneralOrdering" eSuperTypes="#//NamedElement">
@@ -7093,14 +8203,24 @@
         <details key="documentation" value="The guard must be placed directly prior to (above) the OccurrenceSpecification that will become the first OccurrenceSpecification within this InteractionOperand.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="guard_contain_references" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The guard must contain only references to values local to the Lifeline on which it resides, or values global to the whole Interaction.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="guard" ordered="false"
         eType="#//InteractionConstraint" containment="true">
@@ -7126,42 +8246,72 @@
         <details key="documentation" value="The dynamic variables that take part in the constraint must be owned by the ConnectableElement corresponding to the covered Lifeline.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="global_data" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The constraint may contain references to global data or write-once data.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_maxint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Minint/maxint can only be present if the InteractionConstraint is associated with the operand of a loop CombinedFragment.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_non_negative" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If minint is specified, then the expression must evaluate to a non-negative integer.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maxint_positive" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If maxint is specified, then the expression must evaluate to a positive integer.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maxint_greater_equal_minint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If maxint is specified, then minint must be specified and the evaluation of maxint must be >= the evaluation of minint&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="minint" ordered="false"
         eType="#//ValueSpecification" containment="true">
@@ -7188,7 +8338,12 @@
         <details key="documentation" value="The startEvent and the finishEvent must be on the same Lifeline&#xD;&#xA;start.lifeline = finish.lifeline"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="start" ordered="false"
         lowerBound="1" eType="#//OccurrenceSpecification">
@@ -7233,7 +8388,12 @@
         <details key="documentation" value="The Action referenced by the ActionExecutionSpecification, if any, must be owned by the Interaction owning the ActionExecutionOccurrence.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="action" ordered="false"
         lowerBound="1" eType="#//Action">
@@ -7267,7 +8427,12 @@
         <details key="documentation" value="No othet OccurrenceSpecification may appear above an OccurrenceSpecification which references a CreationEvent on a given Lifeline in an InteractionOperand.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DestructionEvent" eSuperTypes="#//Event">
@@ -7279,7 +8444,12 @@
         <details key="documentation" value="No other OccurrenceSpecifications may appear below an OccurrenceSpecification which references a DestructionEvent on a given Lifeline in an InteractionOperand.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="SendOperationEvent" eSuperTypes="#//MessageEvent">
@@ -7365,14 +8535,24 @@
         <details key="documentation" value="An actor can only have associations to use cases, components and classes. Furthermore these associations must be binary.&#xD;&#xA;self.ownedAttribute->forAll ( a |&#xA;(a.association->notEmpty()) implies&#xA;((a.association.memberEnd.size() = 2) and&#xA;(a.opposite.class.oclIsKindOf(UseCase) or&#xA;(a.opposite.class.oclIsKindOf(Class) and not a.opposite.class.oclIsKindOf(Behavior))))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_have_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An actor must have a name.&#xD;&#xA;name->notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CallEvent" eSuperTypes="#//MessageEvent">
@@ -7423,14 +8603,24 @@
         <details key="documentation" value="A fork node has one incoming edge.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The edges coming into and out of a fork node must be either all object flows or all control flows.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FlowFinalNode" eSuperTypes="#//FinalNode">
@@ -7447,7 +8637,12 @@
         <details key="documentation" value="A final node has no outgoing edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CentralBufferNode" eSuperTypes="#//ObjectNode">
@@ -7464,14 +8659,24 @@
         <details key="documentation" value="A merge node has one outgoing edge.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The edges coming into and out of a merge node must be either all object flows or all control flows.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DecisionNode" eSuperTypes="#//ControlNode">
@@ -7483,21 +8688,36 @@
         <details key="documentation" value="A decision node has one incoming edge.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A decision input behavior has zero or one input parameter and one output parameter. Any input parameter must be the same as or a supertype of the type of object tokens coming along the incoming edge. The behavior cannot have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The edges coming into and out of a decision node must be either all object flows or all control flows.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="decisionInput" ordered="false"
         eType="#//Behavior">
@@ -7625,7 +8845,12 @@
         <details key="documentation" value="The internal structure of a Node (if defined) consists solely of parts of type Node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="nestedNode" ordered="false"
         upperBound="-1" eType="#//Node" containment="true">
@@ -7656,7 +8881,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//Association/association_ends"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
   </eClassifiers>
@@ -7669,28 +8899,48 @@
         <details key="documentation" value="If the interactionOperator is opt, loop, break, or neg there must be exactly one operand&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_and_maxint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The InteractionConstraint with minint and maxint only apply when attached to an InteractionOperand where the interactionOperator is loop.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="break" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the interactionOperator is break, the corresponding InteractionOperand must cover all Lifelines within the enclosing InteractionFragment.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="consider_and_ignore" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The interaction operators 'consider' and 'ignore' can only be used for the CombineIgnoreFragment subtype of CombinedFragment&#xD;&#xA;((interactionOperator = #consider) or (interactionOperator = #ignore)) implies oclsisTypeOf(CombineIgnoreFragment)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="interactionOperator" ordered="false"
         lowerBound="1" eType="#//InteractionOperatorKind" defaultValueLiteral="seq">
@@ -7787,21 +9037,36 @@
         <details key="documentation" value="Continuations with the same name may only cover the same set of Lifelines (within one Classifier).&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="global" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Continuations are always global in the enclosing InteractionFragment e.g. it always covers all Lifelines covered by the enclosing InteractionFragment.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="first_or_last_interaction_fragment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Continuations always occur as the very first InteractionFragment or the very last InteractionFragment of the enclosing InteractionFragment.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="setting" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true">
@@ -7819,14 +9084,24 @@
         <details key="documentation" value="The interaction operator of a ConsiderIgnoreFragment must be either 'consider' or 'ignore'.&#xD;&#xA;(interactionOperator = #consider) or (interactionOperator = #ignore)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The NamedElements must be of a type of element that identifies a message (e.g., an Operation, Reception, or a Signal).&#xD;&#xA;message->forAll(m | m.oclIsKindOf(Operation) or m.oclIsKindOf(Reception) or m.oclIsKindOf(Signal))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false"
         upperBound="-1" eType="#//NamedElement">
@@ -7844,28 +9119,48 @@
         <details key="documentation" value="The classifier cannot be abstract.&#xD;&#xA;not (self.classifier.isAbstract = #true)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="classifier_not_association_class" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The classifier cannot be an association class&#xD;&#xA;not self.classifier.oclIsKindOf(AssociationClass)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result pin must be the same as the classifier of the action.&#xD;&#xA;self.result.type = self.classifier"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="classifier" ordered="false"
         lowerBound="1" eType="#//Classifier">
@@ -7890,14 +9185,24 @@
         <details key="documentation" value="The multiplicity of the input pin is 1..1.&#xD;&#xA;self.target.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The input pin has no type.&#xD;&#xA;self.target.type->size() = 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDestroyLinks" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -7928,21 +9233,36 @@
         <details key="documentation" value="The input pins have no type.&#xD;&#xA;self.first.type->size() = 0&#xA;and self.second.type->size() = 0&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the input pins is 1..1.&#xD;&#xA;self.first.multiplicity.is(1,1)&#xA;and self.second.multiplicity.is(1,1)&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_is_boolean" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result is Boolean.&#xD;&#xA;self.result.type.oclIsTypeOf(Boolean)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="first" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -7975,28 +9295,48 @@
         <details key="documentation" value="The action must be contained in an behavior that has a host classifier.&#xD;&#xA;self.context->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_static" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the action is contained in an behavior that is acting as the body of a method, then the operation of the method must not be static.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result output pin is the host classifier.&#xD;&#xA;self.result.type = self.context"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the result output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -8016,35 +9356,60 @@
         <details key="documentation" value="The structural feature must not be static.&#xD;&#xA;self.structuralFeature.isStatic = #false"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the object input pin is the same as the classifier of the object passed on this pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the input pin must be 1..1.&#xD;&#xA;self.object.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Visibility of structural feature must allow access to the object performing the action.&#xD;&#xA;let host : Classifier = self.context in&#xA;self.structuralFeature.visibility = #public&#xA;or host = self.structuralFeature.featuringClassifier.type&#xA;or (self.structuralFeature.visibility = #protected and host.allSupertypes&#xA;->includes(self.structuralFeature.featuringClassifier.type)))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_featuring_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A structural feature has exactly one featuringClassifier.&#xD;&#xA;self.structuralFeature.featuringClassifier->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="structuralFeature" ordered="false"
         lowerBound="1" eType="#//StructuralFeature">
@@ -8071,7 +9436,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//StructuralFeatureAction/multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
@@ -8079,7 +9449,12 @@
         <details key="documentation" value="The type and ordering of the result output pin are the same as the type and ordering of the structural feature.&#xD;&#xA;self.result.type = self.structuralFeature.type&#xA;and self.result.ordering = self.structuralFeature.ordering&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -8101,7 +9476,12 @@
         </eAnnotations>
         <eAnnotations source="redefines" references="#//StructuralFeatureAction/multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
@@ -8109,7 +9489,12 @@
         <details key="documentation" value="The type input pin is the same as the classifier of the structural feature.&#xD;&#xA;self.value.type = self.structuralFeature.featuringClassifier"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -8134,7 +9519,12 @@
         <details key="documentation" value="Actions removing a value from ordered nonunique structural features must have a single removeAt input pin if isRemoveDuplicates is false. It must be of type Unlimited Natural with multiplicity 1..1. Otherwise, the action has no removeAt input pin.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRemoveDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8159,7 +9549,12 @@
         <details key="documentation" value="Actions adding a value to ordered structural features must have a single input pin for the insertion point with type UnlimitedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point.&#xD;&#xA;let insertAtPins : Collection = self.insertAt in&#xA;if self.structuralFeature.isOrdered = #false&#xA;then insertAtPins->size() = 0&#xA;else let insertAtPin : InputPin= insertAt->asSequence()->first() in&#xA;insertAtPins->size() = 1&#xA;and insertAtPin.type = UnlimitedNatural&#xA;and insertAtPin.multiplicity.is(1,1))&#xA;endif&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8184,21 +9579,36 @@
         <details key="documentation" value="The association ends of the link end data must all be from the same association and include all and only the association ends of that association.&#xD;&#xA;self.endData->collect(end) = self.association()->collect(connection))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_static" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The association ends of the link end data must not be static.&#xD;&#xA;self.endData->forall(end.oclisKindOf(NavigableEnd) implies end.isStatic = #false"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The input pins of the action are the same as the pins of the link end data and insertion pins.&#xD;&#xA;self.input->asSet() =&#xA;let ledpins : Set = self.endData->collect(value) in&#xA;if self.oclIsKindOf(LinkEndCreationData)&#xA;then ledpins->union(self.endData.oclAsType(LinkEndCreationData).insertAt)&#xA;else ledpins&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association" ordered="false" lowerBound="1" eType="#//Association">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -8228,35 +9638,60 @@
         <details key="documentation" value="The property must be an association end.&#xD;&#xA;self.end.association->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the end object input pin is the same as the type of the association end.&#xD;&#xA;self.value.type = self.end.type"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the end object input pin must be 1..1.&#xD;&#xA;self.value.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="qualifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The qualifiers include all and only the qualifiers of the association end.&#xD;&#xA;self.qualifier->collect(qualifier) = self.end.qualifier"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="end_object_input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The end object input pin is not also a qualifier value input pin.&#xD;&#xA;self.value->excludesAll(self.qualifier.value)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         eType="#//InputPin">
@@ -8286,21 +9721,36 @@
         <details key="documentation" value="The qualifier attribute must be a qualifier of the association end of the link-end data.&#xD;&#xA;self.LinkEndData.end->collect(qualifier)->includes(self.qualifier)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the qualifier value input pin is the same as the type of the qualifier attribute.&#xD;&#xA;self.value.type = self.qualifier.type"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the qualifier value input pin is &quot;1..1&quot;.&#xD;&#xA;self.value.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="qualifier" ordered="false"
         lowerBound="1" eType="#//Property">
@@ -8324,35 +9774,60 @@
         <details key="documentation" value="Exactly one link-end data specification (the 'open' end) must not have an end object input pin.&#xD;&#xA;self.endData->select(ed | ed.value->size() = 0)->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type and ordering of the result output pin are same as the type and ordering of the open association end.&#xD;&#xA;let openend : AssociationEnd = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in&#xA;self.result.type = openend.type&#xA;and self.result.ordering = openend.ordering&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the open association end must be compatible with the multiplicity of the result output pin.&#xD;&#xA;let openend : AssociationEnd = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in&#xA;openend.multiplicity.compatibleWith(self.result.multiplicity)&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="navigable_open_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The open end must be navigable.&#xD;&#xA;let openend : AssociationEnd = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in&#xA;openend.isNavigable()&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Visibility of the open end must allow access to the object performing the action.&#xD;&#xA;let host : Classifier = self.context in&#xA;let openend : AssociationEnd = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in&#xA;openend.visibility = #public&#xA;or self.endData->exists(oed | not oed.end = openend&#xA;and (host = oed.end.participant&#xA;or (openend.visibility = #protected&#xA;and host.allSupertypes->includes(oed.end.participant))))&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -8371,14 +9846,24 @@
         <details key="documentation" value="LinkEndCreationData can only be end data for CreateLinkAction or one of its specializations.&#xD;&#xA;self.LinkAction.oclIsKindOf(CreateLinkAction)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="single_input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Link end creation data for ordered association ends must have a single input pin for the insertion point with type UnlimitedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point.&#xD;&#xA;let insertAtPins : Collection = self.insertAt in&#xA;if self.end.ordering = #unordered&#xA;then insertAtPins->size() = 0&#xA;else let insertAtPin : InputPin = insertAts->asSequence()->first() in&#xA;insertAtPins->size() = 1&#xA;and insertAtPin.type = UnlimitedNatural&#xA;and insertAtPin.multiplicity.is(1,1))&#xA;endif&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8411,7 +9896,12 @@
         <details key="documentation" value="The association cannot be an abstract classifier.&#xD;&#xA;self.association().isAbstract = #false"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="WriteLinkAction" abstract="true" eSuperTypes="#//LinkAction">
@@ -8423,7 +9913,12 @@
         <details key="documentation" value="The visibility of at least one end must allow access to the class using the action.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DestroyLinkAction" eSuperTypes="#//WriteLinkAction">
@@ -8449,14 +9944,24 @@
         <details key="documentation" value="LinkEndDestructionData can only be end data for DestroyLinkAction or one of its specializations.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unlimited_natural_and_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="LinkEndDestructionData for ordered nonunique association ends must have a single destroyAt input pin if isDestroyDuplicates is false. It must be of type UnlimitedNatural and have a multiplicity of 1..1. Otherwise, the action has no input pin for the removal position.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDestroyDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8480,14 +9985,24 @@
         <details key="documentation" value="The type of the input pin must be the same as the type of at least one of the association ends of the association.&#xD;&#xA;self.association->exists(end.type = self.object.type)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the input pin is 1..1.&#xD;&#xA;self.object.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -8512,14 +10027,24 @@
         <details key="documentation" value="The number and order of argument pins must be the same as the number and order of attributes in the signal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type, ordering, and multiplicity of an argument pin must be the same as the corresponding attribute of the signal.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signal" ordered="false"
         lowerBound="1" eType="#//Signal">
@@ -8556,14 +10081,24 @@
         <details key="documentation" value="The type of value specification must be compatible with the type of the result pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the result pin is 1..1&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//ValueSpecification" containment="true">
@@ -8739,7 +10274,12 @@
         <details key="documentation" value="The multiplicity of firstEvent must be 2 if the multiplicity of constrainedElement is 2. Otherwise the multiplicity of firstEvent is 0.&#xD;&#xA;if (constrainedElement->size() =2)&#xD;&#xA;  then (firstEvent->size() = 2) else (firstEvent->size() = 0)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="firstEvent" ordered="false"
         upperBound="2" eType="#//Boolean" defaultValueLiteral="true">
@@ -8774,7 +10314,12 @@
         <details key="documentation" value="The multiplicity of firstEvent must be 2 if the multiplicity of event is 2. Otherwise the multiplicity of firstEvent is 0.&#xD;&#xA;if (event->size() = 2)&#xD;&#xA;  then (firstEvent->size() = 2) else (firstEvent->size() = 0)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="event" ordered="false"
         lowerBound="1" upperBound="2" eType="#//NamedElement">
@@ -8798,42 +10343,72 @@
         <details key="documentation" value="A final state cannot have any outgoing transitions.&#xD;&#xA;self.outgoing->size() = 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_regions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A final state cannot have regions.&#xD;&#xA;self.region->size() = 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_reference_submachine" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A final state cannot reference a submachine.&#xD;&#xA;self.submachine->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_entry_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A final state has no entry behavior.&#xD;&#xA;self.entry->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_exit_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A final state has no exit behavior.&#xD;&#xA;self.exit->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_state_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A final state has no state (doActivity) behavior.&#xD;&#xA;self.doActivity->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="TimeEvent" eSuperTypes="#//Event">
@@ -8845,14 +10420,24 @@
         <details key="documentation" value="The ValueSpecification when must return a non-negative Integer.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="starting_time" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The starting time for a relative time event may only be omitted for a time event that is the trigger of a state machine.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRelative" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8877,7 +10462,12 @@
         <details key="documentation" value="The action must be in the scope of the variable.&#xD;&#xA;self.variable.isAccessibleBy(self)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false"
         lowerBound="1" eType="#//Variable">
@@ -8895,14 +10485,24 @@
         <details key="documentation" value="The type and ordering of the result output pin of a read-variable action are the same as the type and ordering of the variable.&#xD;&#xA;self.result.type =self.variable.type&#xA;and self.result.ordering = self.variable.ordering&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the variable must be compatible with the multiplicity of the output pin.&#xD;&#xA;self.variable.multiplicity.compatibleWith(self.result.multiplicity)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -8922,14 +10522,24 @@
         <details key="documentation" value="The type input pin is the same as the type of the variable.&#xD;&#xA;self.value.type = self.variable.type"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the input pin is 1..1.&#xD;&#xA;self.value.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -8953,7 +10563,12 @@
         <details key="documentation" value="Actions adding values to ordered variables must have a single input pin for the insertion point with type UnlimtedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point.&#xD;&#xA;let insertAtPins : Collection = self.insertAt in&#xA;if self.variable.ordering = #unordered&#xA;then insertAtPins->size() = 0&#xA;else let insertAtPin : InputPin = insertAt->asSequence()->first() in&#xA;insertAtPins->size() = 1&#xA;and insertAtPin.type = UnlimitedNatural&#xA;and insertAtPin.multiplicity.is(1,1))&#xA;endif&#xA;"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -8978,7 +10593,12 @@
         <details key="documentation" value="Actions removing a value from ordered nonunique variables must have a single removeAt input pin if isRemoveDuplicates is false. It must be of type UnlimitedNatural with multiplicity of 1..1, otherwise the action has no removeAt input pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRemoveDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9015,21 +10635,36 @@
         <details key="documentation" value="The fromAction of an action input pin must have exactly one output pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The fromAction of an action input pin must only have action input pins as input pins.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_control_or_data_flow" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The fromAction of an action input pin cannot have control or data flows coming into or out of it or its pins.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" ordered="false"
         lowerBound="1" eType="#//Action" containment="true">
@@ -9048,21 +10683,36 @@
         <details key="documentation" value="The sources and targets of an information item (its related information flows) must designate subsets of the sources and targets of the representation information item, if any.The Classifiers that can realize an information item can only be of the following kind: Class, Interface, InformationItem, Signal, Component.&#xD;&#xA;(self.represented->select(p | p->oclIsKindOf(InformationItem))->forAll(p |&#xD;&#xA;  p.informationFlow.source->forAll(q | self.informationFlow.source->include(q)) and&#xD;&#xA;    p.informationFlow.target->forAll(q | self.informationFlow.target->include(q)))) and&#xD;&#xA;      (self.represented->forAll(p | p->oclIsKindOf(Class) or oclIsKindOf(Interface) or&#xD;&#xA;        oclIsKindOf(InformationItem) or oclIsKindOf(Signal) or oclIsKindOf(Component)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_no" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An informationItem has no feature, no generalization, and no associations.&#xD;&#xA;self.generalization->isEmpty() and self.feature->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_instantiable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="It is not instantiable.&#xD;&#xA;isAbstract"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="represented" ordered="false"
         upperBound="-1" eType="#//Classifier">
@@ -9080,21 +10730,36 @@
         <details key="documentation" value="The sources and targets of the information flow can only be one of the following kind: Actor, Node, UseCase, Artifact, Class, Component, Port, Property, Interface, Package, ActivityNode, ActivityPartition and InstanceSpecification except when its classifier is a relationship (i.e. it represents a link).&#xD;&#xA;(self.source->forAll(p | p->oclIsKindOf(Actor) or oclIsKindOf(Node) or&#xD;&#xA;  oclIsKindOf(UseCase) or oclIsKindOf(Artifact) or oclIsKindOf(Class) or&#xD;&#xA;  oclIsKindOf(Component) or oclIsKindOf(Port) or oclIsKindOf(Property) or&#xD;&#xA;  oclIsKindOf(Interface) or oclIsKindOf(Package) or oclIsKindOf(ActivityNode) or&#xD;&#xA;  oclIsKindOf(ActivityPartition) or oclIsKindOf(InstanceSpecification))) and&#xD;&#xA;    (self.target->forAll(p | p->oclIsKindOf(Actor) or oclIsKindOf(Node) or&#xD;&#xA;      oclIsKindOf(UseCase) or oclIsKindOf(Artifact) or oclIsKindOf(Class) or&#xD;&#xA;      oclIsKindOf(Component) or oclIsKindOf(Port) or oclIsKindOf(Property) or&#xD;&#xA;      oclIsKindOf(Interface) or oclIsKindOf(Package) or oclIsKindOf(ActivityNode) or&#xD;&#xA;      oclIsKindOf(ActivityPartition) or oclIsKindOf(InstanceSpecification)))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_conform" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The sources and targets of the information flow must conform with the sources and targets or conversely the targets and sources of the realization relationships.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="convey_classifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An information flow can only convey classifiers that are allowed to represent an information item.&#xD;&#xA;&#xD;&#xA;self.conveyed.represented->forAll(p | p->oclIsKindOf(Class) or oclIsKindOf(Interface)&#xD;&#xA;  or oclIsKindOf(InformationItem) or oclIsKindOf(Signal) or oclIsKindOf(Component))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="realization" ordered="false"
         upperBound="-1" eType="#//Relationship">
@@ -9150,14 +10815,24 @@
         <details key="documentation" value="The type of the result output pin is the classifier.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the result output pin is 0..*.&#xD;&#xA;self.result.multiplicity.is(0,#null)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -9182,21 +10857,36 @@
         <details key="documentation" value="None of the new classifiers may be abstract.&#xD;&#xA;not self.newClassifier->exists(isAbstract = true)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the input pin is 1..1.&#xD;&#xA;self.argument.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The input pin has no type.&#xD;&#xA;self.argument.type->size() = 0"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9233,28 +10923,48 @@
         <details key="documentation" value="The multiplicity of the input pin is 1..1.&#xD;&#xA;self.object.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The input pin has no type.&#xD;&#xA;self.object.type->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_output" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="boolean_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the output pin is Boolean&#xD;&#xA;self.result.type = Boolean"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDirect" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9292,14 +11002,24 @@
         <details key="documentation" value="The multiplicity of the input pin is 1..1&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_has_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the input pin has a type, then the type must have a classifier behavior.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -9318,49 +11038,84 @@
         <details key="documentation" value="The property must be an association end.&#xD;&#xA;self.end.association.notEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The association of the association end must be an association class.&#xD;&#xA;self.end.Association.oclIsKindOf(AssociationClass)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ends_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The ends of the association must not be static.&#xD;&#xA;self.end.association.memberEnd->forall(e | not e.isStatic)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the object input pin is the association class that owns the association end.&#xD;&#xA;self.object.type = self.end.association"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the object input pin is 1..1.&#xD;&#xA;self.object.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result output pin is the same as the type of the association end.&#xD;&#xA;self.result.type = self.end.type"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the result output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -9392,56 +11147,96 @@
         <details key="documentation" value="The qualifier attribute must be a qualifier attribute of an association end.&#xD;&#xA;self.qualifier.associationEnd->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The association of the association end of the qualifier attribute must be an association class.&#xD;&#xA;self.qualifier.associationEnd.association.oclIsKindOf(AssociationClass)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ends_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The ends of the association must not be static.&#xD;&#xA;self.qualifier.associationEnd.association.memberEnd->forall(e | not e.isStatic)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the object input pin is the association class that owns the association end that has the given qualifier attribute.&#xD;&#xA;self.object.type = self.qualifier.associationEnd.association"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the qualifier attribute is 1..1.&#xD;&#xA;self.qualifier.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the object input pin is 1..1.&#xD;&#xA;self.object.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result output pin is the same as the type of the qualifier attribute.&#xD;&#xA;self.result.type = self.qualifier.type"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the result output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -9473,21 +11268,36 @@
         <details key="documentation" value="The association must be an association class.&#xD;&#xA;self.association().oclIsKindOf(Class)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the result pin must be the same as the association of the action.&#xD;&#xA;self.result.type = self.association()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the output pin is 1..1.&#xD;&#xA;self.result.multiplicity.is(1,1)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -9506,28 +11316,48 @@
         <details key="documentation" value="AcceptEventActions may have no input pins.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="There are no output pins if the trigger events are only ChangeEvents, or if they are only CallEvents when this action is an instance of AcceptEventAction and not an instance of a descendant of AcceptEventAction (such as AcceptCallAction).&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="trigger_events" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If the trigger events are all TimeEvents, there is exactly one output pin.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshall_signal_events" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If isUnmarshall is true, there must be exactly one trigger for events of type SignalEvent. The number of result output pins must be the same as the number of attributes of the signal. The type and ordering of each result output pin must be the same as the corresponding attribute of the signal. The multiplicity of each result output pin must be compatible with the multiplicity of the corresponding attribute.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isUnmarshall" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9558,21 +11388,36 @@
         <details key="documentation" value="The result pins must match the in and inout parameters of the operation specified by the trigger event in number, type, and order.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="trigger_call_event" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The trigger event must be a CallEvent.&#xD;&#xA;trigger.event.oclIsKindOf(CallEvent)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshall" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="isUnmrashall must be true for an AcceptCallAction.&#xD;&#xA;isUnmarshall = true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="returnInformation" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -9591,14 +11436,24 @@
         <details key="documentation" value="The reply value pins must match the return, out, and inout parameters of the operation on the event on the trigger in number, type, and order.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="event_on_reply_to_call_trigger" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The event on replyToCall trigger must be a CallEvent replyToCallEvent.oclIsKindOf(CallEvent)&#xD;&#xA;replyToCallEvent.oclIsKindOf(CallEvent)"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="replyToCall" ordered="false"
         lowerBound="1" eType="#//Trigger">
@@ -9630,49 +11485,84 @@
         <details key="documentation" value="The type of the object input pin must be the same as the unmarshall classifier.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of the object input pin is 1..1&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="number_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The number of result output pins must be the same as the number of structural features of the unmarshall classifier.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type and ordering of each result output pin must be the same as the corresponding structural feature of the unmarshall classifier.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The multiplicity of each result output pin must be compatible with the multiplicity of the corresponding structural features of the unmarshall classifier.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structural_feature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The unmarshall classifier must have at least one structural feature.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshallType_is_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="unmarshallType must be a Classifier with ordered attributes&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" upperBound="-1" eType="#//OutputPin" containment="true">
@@ -9704,21 +11594,36 @@
         <details key="documentation" value="The type of the input must be a collection.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="output_types_are_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The type of the output must be compatible with the type of the output of the reducer behavior.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="reducer_inputs_output" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The reducer behavior must have two input parameters and one output parameter, of types compatible with the types of elements of the input collection.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="reducer" ordered="false"
         lowerBound="1" eType="#//Behavior">
@@ -9756,14 +11661,24 @@
         <details key="documentation" value="A join node has one outgoing edge.&#xD;&#xA;self.outgoing->size() = 1"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="incoming_object_flow" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a join node has an incoming object flow, it must have an outgoing object flow, otherwise, it must have an outgoing control flow.&#xD;&#xA;(self.incoming.select(e | e.isTypeOf(ObjectFlow)->notEmpty() implies&#xD;&#xA;  self.outgoing.isTypeOf(ObjectFlow)) and&#xD;&#xA;    (self.incoming.select(e | e.isTypeOf(ObjectFlow)->empty() implies&#xD;&#xA;      self.outgoing.isTypeOf(ControlFlow))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isCombineDuplicate" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true">
@@ -9793,56 +11708,96 @@
         <details key="documentation" value="Object flows may not have actions at either end.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_types" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Object nodes connected by an object flow, with optionally intervening control nodes, must have compatible types. In particular, the downstream object node type must be the same or a supertype of the upstream object node type.&#xD;&#xA;&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_upper_bounds" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="Object nodes connected by an object flow, with optionally intervening control nodes, must have the same upper bounds.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An edge with constant weight may not target an object node, or lead to an object node downstream with no intervening actions, that has an upper bound less than the weight.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transformation_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A transformation behavior has one input parameter and one output parameter. The input parameter must be the same as or a supertype of the type of object token coming from the source end. The output parameter must be the same or a subtype of the type of object token expected downstream. The behavior cannot have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selection_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="An object flow may have a selection behavior only if has an object node as a source.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_and_output_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A selection behavior has one input parameter and one output parameter. The input parameter must be a bag of elements of the same as or a supertype of the type of source object node. The output parameter must be the same or a subtype of the type of source object node. The behavior cannot have side effects.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="is_multicast_or_is_multireceive" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="isMulticast and isMultireceive cannot both be true.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isMulticast" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9878,7 +11833,12 @@
         <details key="documentation" value="The result output pins have no incoming edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDeterminate" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -9916,14 +11876,24 @@
         <details key="documentation" value="The decider output pin must be for the test body or a node contained by the test body as a structured node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="body_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The bodyOutput pins are output pins on actions in the body of the clause.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="test" ordered="false" upperBound="-1"
         eType="#//ExecutableNode">
@@ -9971,21 +11941,36 @@
         <details key="documentation" value="Loop variable inputs must not have outgoing edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="body_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The bodyOutput pins are output pins on actions in the body of the loop node.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_no_incoming" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The result output pins have no incoming edges.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isTestedFirst" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false">
@@ -10070,7 +12055,12 @@
         <details key="documentation" value="An ExpansionRegion must have one or more argument ExpansionNodes and zero or more result ExpansionNodes.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" ordered="false" lowerBound="1"
         eType="#//ExpansionKind" defaultValueLiteral="iterative">
@@ -10120,21 +12110,36 @@
         <details key="documentation" value="A protocol transition always belongs to a protocol state machine.&#xD;&#xA;container.belongsToPSM()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="associated_actions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="A protocol transition never has associated actions.&#xD;&#xA;effect->isEmpty()"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="refers_to_operation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="If a protocol transition refers to an operation (i. e. has a call trigger corresponding to an operation), then that operation should apply to the context classifier of the state machine of the protocol transition.&#xD;&#xA;true"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="postCondition" ordered="false"
         eType="#//Constraint">
@@ -10167,7 +12172,12 @@
         <details key="documentation" value="An AssociationClass cannot be defined between itself and something else.&#xD;&#xA;self.endType->excludes(self) and self.endType>collect(et|et.allparents()->excludes(self))"/>
       </eAnnotations>
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="allConnections" ordered="false" lowerBound="2" upperBound="-1"
         eType="#//Property">
diff --git a/plugins/org.eclipse.uml2.uml/model/UML.genmodel b/plugins/org.eclipse.uml2.uml/model/UML.genmodel
index 06e2179..b385657 100644
--- a/plugins/org.eclipse.uml2.uml/model/UML.genmodel
+++ b/plugins/org.eclipse.uml2.uml/model/UML.genmodel
@@ -7,7 +7,8 @@
     editPluginClass="org.eclipse.uml2.uml.edit.UMLEditPlugin" editorPluginClass="org.eclipse.uml2.uml.editor.UMLEditorPlugin"
     nonNLSMarkers="true" rootExtendsInterface="" codeFormatting="true" booleanFlagsField="eFlags"
     booleanFlagsReservedBits="8" importerID="org.eclipse.uml2.uml.ecore.importer"
-    containmentProxies="true" minimalReflectiveMethods="false" usedGenPackages="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"
+    containmentProxies="true" minimalReflectiveMethods="false" complianceLevel="5.0"
+    usedGenPackages="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"
     factoryMethods="true" pluralizedGetters="true" cacheAdapterSupport="true" invariantPrefix="validate">
   <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
     <details key="DUPLICATE_FEATURES" value="PROCESS"/>
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptCallAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptCallAction.java
index ca0b7c7..8c4bf80 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptCallAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptCallAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptCallAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: AcceptCallAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -86,7 +86,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateResultPins(DiagnosticChain diagnostics, Map context);
+	boolean validateResultPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,7 +99,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTriggerCallEvent(DiagnosticChain diagnostics, Map context);
+	boolean validateTriggerCallEvent(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -110,6 +112,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateUnmarshall(DiagnosticChain diagnostics, Map context);
+	boolean validateUnmarshall(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // AcceptCallAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptEventAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptEventAction.java
index ba207a1..d9025f0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptEventAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AcceptEventAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptEventAction.java,v 1.10 2006/05/26 16:34:03 khussey Exp $
+ * $Id: AcceptEventAction.java,v 1.11 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -82,7 +82,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getResults();
+	EList<OutputPin> getResults();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Result</b></em>' containment reference list.
@@ -149,7 +149,7 @@
 	 * @model type="org.eclipse.uml2.uml.Trigger" containment="true" resolveProxies="true" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getTriggers();
+	EList<Trigger> getTriggers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Trigger}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Trigger</b></em>' containment reference list.
@@ -196,7 +196,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoInputPins(DiagnosticChain diagnostics, Map context);
+	boolean validateNoInputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -208,7 +209,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoOutputPins(DiagnosticChain diagnostics, Map context);
+	boolean validateNoOutputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -220,7 +222,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTriggerEvents(DiagnosticChain diagnostics, Map context);
+	boolean validateTriggerEvents(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -233,6 +236,6 @@
 	 * @generated
 	 */
 	boolean validateUnmarshallSignalEvents(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // AcceptEventAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Action.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Action.java
index 2485f37..bae01fa 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Action.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Action.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Action.java,v 1.11 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Action.java,v 1.12 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
-	EList getOutputs();
+	EList<OutputPin> getOutputs();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.OutputPin} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Output</b></em>' reference list.
@@ -98,7 +98,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
-	EList getInputs();
+	EList<InputPin> getInputs();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.InputPin} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Input</b></em>' reference list.
@@ -153,7 +153,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getLocalPreconditions();
+	EList<Constraint> getLocalPreconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Local Precondition</b></em>' containment reference list.
@@ -217,7 +217,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getLocalPostconditions();
+	EList<Constraint> getLocalPostconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Local Postcondition</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionExecutionSpecification.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionExecutionSpecification.java
index 3a5b769..768b9c2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionExecutionSpecification.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionExecutionSpecification.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionExecutionSpecification.java,v 1.2 2006/05/12 20:38:10 khussey Exp $
+ * $Id: ActionExecutionSpecification.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,6 +74,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateActionReferenced(DiagnosticChain diagnostics, Map context);
+	boolean validateActionReferenced(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActionExecutionSpecification
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionInputPin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionInputPin.java
index 0eaadd6..af74d96 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionInputPin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActionInputPin.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionInputPin.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ActionInputPin.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -88,7 +88,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneOutputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateOneOutputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -100,7 +101,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,6 +114,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoControlOrDataFlow(DiagnosticChain diagnostics, Map context);
+	boolean validateNoControlOrDataFlow(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActionInputPin
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Activity.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Activity.java
index e262650..ae3deed 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Activity.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Activity.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Activity.java,v 1.14 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Activity.java,v 1.15 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -91,7 +91,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityGroup" opposite="inActivity" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getGroups();
+	EList<ActivityGroup> getGroups();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityGroup} and appends it to the '<em><b>Group</b></em>' containment reference list.
@@ -143,7 +143,7 @@
 	 * @model type="org.eclipse.uml2.uml.StructuredActivityNode" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getStructuredNodes();
+	EList<StructuredActivityNode> getStructuredNodes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.StructuredActivityNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Structured Node</b></em>' reference list.
@@ -185,7 +185,7 @@
 	 * @model type="org.eclipse.uml2.uml.Variable" opposite="activityScope" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getVariables();
+	EList<Variable> getVariables();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Variable}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Variable</b></em>' containment reference list.
@@ -241,7 +241,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" opposite="activity" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getNodes();
+	EList<ActivityNode> getNodes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityNode}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Node</b></em>' containment reference list.
@@ -296,7 +296,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="activity" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getEdges();
+	EList<ActivityEdge> getEdges();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityEdge}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Edge</b></em>' containment reference list.
@@ -349,7 +349,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityPartition" ordered="false"
 	 * @generated
 	 */
-	EList getPartitions();
+	EList<ActivityPartition> getPartitions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityPartition}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Partition</b></em>' reference list.
@@ -397,7 +397,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoSupergroups(DiagnosticChain diagnostics, Map context);
+	boolean validateNoSupergroups(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -410,7 +411,7 @@
 	 * @generated
 	 */
 	boolean validateActivityParameterNode(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -422,6 +423,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAutonomous(DiagnosticChain diagnostics, Map context);
+	boolean validateAutonomous(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Activity
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityEdge.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityEdge.java
index 3671e79..25464bd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityEdge.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityEdge.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityEdge.java,v 1.13 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ActivityEdge.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -95,7 +95,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityGroup" opposite="containedEdge" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getInGroups();
+	EList<ActivityGroup> getInGroups();
 
 	/**
 	 * Returns the value of the '<em><b>In Partition</b></em>' reference list.
@@ -112,7 +112,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityPartition" opposite="edge" ordered="false"
 	 * @generated
 	 */
-	EList getInPartitions();
+	EList<ActivityPartition> getInPartitions();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityPartition} with the specified '<em><b>Name</b></em>' from the '<em><b>In Partition</b></em>' reference list.
@@ -204,7 +204,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedEdges();
+	EList<ActivityEdge> getRedefinedEdges();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Edge</b></em>' reference list.
@@ -370,7 +370,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSourceAndTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateSourceAndTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -382,7 +383,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwned(DiagnosticChain diagnostics, Map context);
+	boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -394,6 +396,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateStructuredNode(DiagnosticChain diagnostics, Map context);
+	boolean validateStructuredNode(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActivityEdge
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityGroup.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityGroup.java
index 1b52957..fa6aca7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityGroup.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityGroup.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityGroup.java,v 1.11 2006/05/24 20:54:28 khussey Exp $
+ * $Id: ActivityGroup.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -62,7 +62,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityGroup" opposite="superGroup" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getSubgroups();
+	EList<ActivityGroup> getSubgroups();
 
 	/**
 	 * Returns the value of the '<em><b>Super Group</b></em>' reference.
@@ -95,7 +95,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" opposite="inGroup" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getContainedNodes();
+	EList<ActivityNode> getContainedNodes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Contained Node</b></em>' reference list.
@@ -163,7 +163,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="inGroup" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getContainedEdges();
+	EList<ActivityEdge> getContainedEdges();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Contained Edge</b></em>' reference list.
@@ -199,7 +199,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNodesAndEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNodesAndEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -211,7 +212,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotContained(DiagnosticChain diagnostics, Map context);
+	boolean validateNotContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -223,6 +225,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGroupOwned(DiagnosticChain diagnostics, Map context);
+	boolean validateGroupOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActivityGroup
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityNode.java
index a883d7c..8f50050 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityNode.java,v 1.10 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ActivityNode.java,v 1.11 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -65,7 +65,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="source" ordered="false"
 	 * @generated
 	 */
-	EList getOutgoings();
+	EList<ActivityEdge> getOutgoings();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Outgoing</b></em>' reference list.
@@ -106,7 +106,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityGroup" opposite="containedNode" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getInGroups();
+	EList<ActivityGroup> getInGroups();
 
 	/**
 	 * Returns the value of the '<em><b>In Partition</b></em>' reference list.
@@ -123,7 +123,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityPartition" opposite="node" ordered="false"
 	 * @generated
 	 */
-	EList getInPartitions();
+	EList<ActivityPartition> getInPartitions();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityPartition} with the specified '<em><b>Name</b></em>' from the '<em><b>In Partition</b></em>' reference list.
@@ -217,7 +217,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="target" ordered="false"
 	 * @generated
 	 */
-	EList getIncomings();
+	EList<ActivityEdge> getIncomings();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Incoming</b></em>' reference list.
@@ -258,7 +258,7 @@
 	 * @model type="org.eclipse.uml2.uml.InterruptibleActivityRegion" opposite="node" ordered="false"
 	 * @generated
 	 */
-	EList getInInterruptibleRegions();
+	EList<InterruptibleActivityRegion> getInInterruptibleRegions();
 
 	/**
 	 * Returns the value of the '<em><b>Redefined Node</b></em>' reference list.
@@ -273,7 +273,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedNodes();
+	EList<ActivityNode> getRedefinedNodes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Node</b></em>' reference list.
@@ -309,7 +309,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwned(DiagnosticChain diagnostics, Map context);
+	boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -321,6 +322,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwnedStructuredNode(DiagnosticChain diagnostics, Map context);
+	boolean validateOwnedStructuredNode(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActivityNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityParameterNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityParameterNode.java
index 673a542..2a8aabd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityParameterNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityParameterNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityParameterNode.java,v 1.4 2006/05/12 20:38:10 khussey Exp $
+ * $Id: ActivityParameterNode.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,7 +74,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHasParameters(DiagnosticChain diagnostics, Map context);
+	boolean validateHasParameters(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -86,7 +87,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,7 +100,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -111,7 +114,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoIncomingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -124,6 +128,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoOutgoingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ActivityParameterNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityPartition.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityPartition.java
index 6d96059..27642fb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityPartition.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ActivityPartition.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityPartition.java,v 1.15 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ActivityPartition.java,v 1.16 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -116,7 +116,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="inPartition" ordered="false"
 	 * @generated
 	 */
-	EList getEdges();
+	EList<ActivityEdge> getEdges();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Edge</b></em>' reference list.
@@ -157,7 +157,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" opposite="inPartition" ordered="false"
 	 * @generated
 	 */
-	EList getNodes();
+	EList<ActivityNode> getNodes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Node</b></em>' reference list.
@@ -198,7 +198,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityPartition" opposite="superPartition" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getSubpartitions();
+	EList<ActivityPartition> getSubpartitions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityPartition}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Subpartition</b></em>' containment reference list.
@@ -299,7 +299,7 @@
 	 * @generated
 	 */
 	boolean validateDimensionNotContained(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -311,7 +311,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateRepresentsPart(DiagnosticChain diagnostics, Map context);
+	boolean validateRepresentsPart(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -324,7 +325,7 @@
 	 * @generated
 	 */
 	boolean validateRepresentsClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -337,6 +338,6 @@
 	 * @generated
 	 */
 	boolean validateRepresentsPartAndIsContained(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ActivityPartition
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Actor.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Actor.java
index 7da9d93..2b2be51 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Actor.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Actor.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Actor.java,v 1.4 2006/05/12 20:38:08 khussey Exp $
+ * $Id: Actor.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -48,7 +48,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssociations(DiagnosticChain diagnostics, Map context);
+	boolean validateAssociations(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -60,6 +61,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustHaveName(DiagnosticChain diagnostics, Map context);
+	boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Actor
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddStructuralFeatureValueAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddStructuralFeatureValueAction.java
index e8b832c..e2bf284 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddStructuralFeatureValueAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddStructuralFeatureValueAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddStructuralFeatureValueAction.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: AddStructuralFeatureValueAction.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -137,6 +137,6 @@
 	 * @generated
 	 */
 	boolean validateUnlimitedNaturalAndMultiplicity(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 } // AddStructuralFeatureValueAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddVariableValueAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddVariableValueAction.java
index f35aff7..3cb356d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddVariableValueAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AddVariableValueAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddVariableValueAction.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: AddVariableValueAction.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -136,6 +136,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSingleInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateSingleInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // AddVariableValueAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AggregationKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AggregationKind.java
index 025f9e6..fb7ed26 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AggregationKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AggregationKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AggregationKind.java,v 1.3 2006/05/12 20:38:04 khussey Exp $
+ * $Id: AggregationKind.java,v 1.4 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,37 @@
  * @model
  * @generated
  */
-public final class AggregationKind
-		extends AbstractEnumerator {
+public enum AggregationKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>None</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NONE
+	 * @generated
+	 * @ordered
+	 */
+	NONE_LITERAL(0, "none", "none"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Shared</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SHARED
+	 * @generated
+	 * @ordered
+	 */
+	SHARED_LITERAL(1, "shared", "shared"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Composite</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #COMPOSITE
+	 * @generated
+	 * @ordered
+	 */
+	COMPOSITE_LITERAL(2, "composite", "composite"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>None</b></em>' literal value.
@@ -76,39 +105,6 @@
 	public static final int COMPOSITE = 2;
 
 	/**
-	 * The '<em><b>None</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #NONE
-	 * @generated
-	 * @ordered
-	 */
-	public static final AggregationKind NONE_LITERAL = new AggregationKind(
-		NONE, "none", "none"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Shared</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SHARED
-	 * @generated
-	 * @ordered
-	 */
-	public static final AggregationKind SHARED_LITERAL = new AggregationKind(
-		SHARED, "shared", "shared"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Composite</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #COMPOSITE
-	 * @generated
-	 * @ordered
-	 */
-	public static final AggregationKind COMPOSITE_LITERAL = new AggregationKind(
-		COMPOSITE, "composite", "composite"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Aggregation Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -123,8 +119,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<AggregationKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Aggregation Kind</b></em>' literal with the specified literal value.
@@ -177,13 +173,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private AggregationKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //AggregationKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Artifact.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Artifact.java
index df6795b..f0c694c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Artifact.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Artifact.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Artifact.java,v 1.10 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Artifact.java,v 1.11 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -111,7 +111,7 @@
 	 * @model type="org.eclipse.uml2.uml.Artifact" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getNestedArtifacts();
+	EList<Artifact> getNestedArtifacts();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Artifact}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Artifact</b></em>' containment reference list.
@@ -175,7 +175,7 @@
 	 * @model type="org.eclipse.uml2.uml.Manifestation" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getManifestations();
+	EList<Manifestation> getManifestations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Manifestation}, with the specified '<em><b>Name</b></em>', and '<em><b>Utilized Element</b></em>', and appends it to the '<em><b>Manifestation</b></em>' containment reference list.
@@ -232,7 +232,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedOperations();
+	EList<Operation> getOwnedOperations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Operation}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -245,8 +245,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation createOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -259,8 +259,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -275,8 +275,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -294,7 +294,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedAttributes();
+	EList<Property> getOwnedAttributes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Attribute</b></em>' containment reference list.
@@ -358,8 +358,8 @@
 	 * @model required="true" ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false" returnTypeOrdered="false"
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType);
+	Operation createOwnedOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Association.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Association.java
index 05d4b2c..77e5545 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Association.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Association.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Association.java,v 1.12 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Association.java,v 1.13 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -86,7 +86,7 @@
 	 * @model type="org.eclipse.uml2.uml.Type" required="true" transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
-	EList getEndTypes();
+	EList<Type> getEndTypes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Type} with the specified '<em><b>Name</b></em>' from the '<em><b>End Type</b></em>' reference list.
@@ -127,7 +127,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" opposite="association" lower="2"
 	 * @generated
 	 */
-	EList getMemberEnds();
+	EList<Property> getMemberEnds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Property} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Member End</b></em>' reference list.
@@ -169,7 +169,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" ordered="false"
 	 * @generated
 	 */
-	EList getNavigableOwnedEnds();
+	EList<Property> getNavigableOwnedEnds();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Navigable Owned End</b></em>' reference list.
@@ -239,7 +239,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" opposite="owningAssociation" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedEnds();
+	EList<Property> getOwnedEnds();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned End</b></em>' containment reference list.
@@ -305,7 +305,7 @@
 	 * @generated
 	 */
 	boolean validateSpecializedEndNumber(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -317,7 +317,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSpecializedEndTypes(DiagnosticChain diagnostics, Map context);
+	boolean validateSpecializedEndTypes(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -329,7 +330,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBinaryAssociations(DiagnosticChain diagnostics, Map context);
+	boolean validateBinaryAssociations(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -341,7 +343,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssociationEnds(DiagnosticChain diagnostics, Map context);
+	boolean validateAssociationEnds(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AssociationClass.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AssociationClass.java
index 00b2cae..179f531 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AssociationClass.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/AssociationClass.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AssociationClass.java,v 1.3 2006/05/12 20:38:08 khussey Exp $
+ * $Id: AssociationClass.java,v 1.4 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -45,7 +45,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCannotBeDefined(DiagnosticChain diagnostics, Map context);
+	boolean validateCannotBeDefined(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -57,6 +58,6 @@
 	 * @model type="org.eclipse.uml2.uml.Property" lower="2" ordered="false"
 	 * @generated
 	 */
-	EList allConnections();
+	EList<Property> allConnections();
 
 } // AssociationClass
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Behavior.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Behavior.java
index a576e86..bccc26c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Behavior.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Behavior.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Behavior.java,v 1.17 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Behavior.java,v 1.18 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -90,7 +90,7 @@
 	 * @model type="org.eclipse.uml2.uml.Behavior" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedBehaviors();
+	EList<Behavior> getRedefinedBehaviors();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Behavior} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Behavior</b></em>' reference list.
@@ -130,7 +130,7 @@
 	 * @model type="org.eclipse.uml2.uml.Parameter" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedParameters();
+	EList<Parameter> getOwnedParameters();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Parameter}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Parameter</b></em>' containment reference list.
@@ -198,7 +198,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPreconditions();
+	EList<Constraint> getPreconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Precondition</b></em>' containment reference list.
@@ -262,7 +262,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPostconditions();
+	EList<Constraint> getPostconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Postcondition</b></em>' containment reference list.
@@ -326,7 +326,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterSet" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedParameterSets();
+	EList<ParameterSet> getOwnedParameterSets();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ParameterSet}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Parameter Set</b></em>' containment reference list.
@@ -401,7 +401,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateParametersMatch(DiagnosticChain diagnostics, Map context);
+	boolean validateParametersMatch(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -414,7 +415,7 @@
 	 * @generated
 	 */
 	boolean validateFeatureOfContextClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -426,7 +427,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustRealize(DiagnosticChain diagnostics, Map context);
+	boolean validateMustRealize(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -438,6 +440,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMostOneBehaviour(DiagnosticChain diagnostics, Map context);
+	boolean validateMostOneBehaviour(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Behavior
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioralFeature.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioralFeature.java
index bc2aa3e..5ff4636 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioralFeature.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioralFeature.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioralFeature.java,v 1.12 2006/06/07 21:39:13 khussey Exp $
+ * $Id: BehavioralFeature.java,v 1.13 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -59,7 +59,7 @@
 	 * @model type="org.eclipse.uml2.uml.Parameter" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedParameters();
+	EList<Parameter> getOwnedParameters();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Parameter}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Parameter</b></em>' containment reference list.
@@ -141,7 +141,7 @@
 	 * @model type="org.eclipse.uml2.uml.Behavior" opposite="specification" ordered="false"
 	 * @generated
 	 */
-	EList getMethods();
+	EList<Behavior> getMethods();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Behavior} with the specified '<em><b>Name</b></em>' from the '<em><b>Method</b></em>' reference list.
@@ -210,7 +210,7 @@
 	 * @model type="org.eclipse.uml2.uml.Type" ordered="false"
 	 * @generated
 	 */
-	EList getRaisedExceptions();
+	EList<Type> getRaisedExceptions();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Type} with the specified '<em><b>Name</b></em>' from the '<em><b>Raised Exception</b></em>' reference list.
@@ -249,7 +249,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterSet" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedParameterSets();
+	EList<ParameterSet> getOwnedParameterSets();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ParameterSet}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Parameter Set</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioredClassifier.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioredClassifier.java
index efe0cc0..2089930 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioredClassifier.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BehavioredClassifier.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioredClassifier.java,v 1.10 2006/06/07 21:39:13 khussey Exp $
+ * $Id: BehavioredClassifier.java,v 1.11 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -60,7 +60,7 @@
 	 * @model type="org.eclipse.uml2.uml.Behavior" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedBehaviors();
+	EList<Behavior> getOwnedBehaviors();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Behavior}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Behavior</b></em>' containment reference list.
@@ -152,7 +152,7 @@
 	 * @model type="org.eclipse.uml2.uml.InterfaceRealization" opposite="implementingClassifier" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getInterfaceRealizations();
+	EList<InterfaceRealization> getInterfaceRealizations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InterfaceRealization}, with the specified '<em><b>Name</b></em>', and '<em><b>Contract</b></em>', and appends it to the '<em><b>Interface Realization</b></em>' containment reference list.
@@ -207,7 +207,7 @@
 	 * @model type="org.eclipse.uml2.uml.Trigger" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedTriggers();
+	EList<Trigger> getOwnedTriggers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Trigger}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Trigger</b></em>' containment reference list.
@@ -255,7 +255,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateClassBehavior(DiagnosticChain diagnostics, Map context);
+	boolean validateClassBehavior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -266,7 +267,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Interface" ordered="false"
 	 * @generated
 	 */
-	EList getImplementedInterfaces();
+	EList<Interface> getImplementedInterfaces();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -277,6 +278,6 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Interface" ordered="false"
 	 * @generated
 	 */
-	EList getAllImplementedInterfaces();
+	EList<Interface> getAllImplementedInterfaces();
 
 } // BehavioredClassifier
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BroadcastSignalAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BroadcastSignalAction.java
index 5666e3b..e2ed6fa 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BroadcastSignalAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/BroadcastSignalAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BroadcastSignalAction.java,v 1.2 2006/05/12 20:38:03 khussey Exp $
+ * $Id: BroadcastSignalAction.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,7 +74,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNumberAndOrder(DiagnosticChain diagnostics, Map context);
+	boolean validateNumberAndOrder(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -87,6 +88,6 @@
 	 * @generated
 	 */
 	boolean validateTypeOrderingMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // BroadcastSignalAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallAction.java
index c7bbeb8..47e52f9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallAction.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: CallAction.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -83,7 +83,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getResults();
+	EList<OutputPin> getResults();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Result</b></em>' containment reference list.
@@ -134,7 +134,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSynchronousCall(DiagnosticChain diagnostics, Map context);
+	boolean validateSynchronousCall(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -146,7 +147,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNumberAndOrder(DiagnosticChain diagnostics, Map context);
+	boolean validateNumberAndOrder(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -159,6 +161,6 @@
 	 * @generated
 	 */
 	boolean validateTypeOrderingMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // CallAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallBehaviorAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallBehaviorAction.java
index af6f9fd..5f50700 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallBehaviorAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallBehaviorAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallBehaviorAction.java,v 1.2 2006/05/12 20:38:07 khussey Exp $
+ * $Id: CallBehaviorAction.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -75,7 +75,7 @@
 	 * @generated
 	 */
 	boolean validateArgumentPinEqualParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -88,6 +88,6 @@
 	 * @generated
 	 */
 	boolean validateResultPinEqualParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // CallBehaviorAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallConcurrencyKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallConcurrencyKind.java
index b081723..398f497 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallConcurrencyKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallConcurrencyKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallConcurrencyKind.java,v 1.4 2006/05/12 20:38:05 khussey Exp $
+ * $Id: CallConcurrencyKind.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,37 @@
  * @model
  * @generated
  */
-public final class CallConcurrencyKind
-		extends AbstractEnumerator {
+public enum CallConcurrencyKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Sequential</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SEQUENTIAL
+	 * @generated
+	 * @ordered
+	 */
+	SEQUENTIAL_LITERAL(0, "sequential", "sequential"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Guarded</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #GUARDED
+	 * @generated
+	 * @ordered
+	 */
+	GUARDED_LITERAL(1, "guarded", "guarded"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Concurrent</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CONCURRENT
+	 * @generated
+	 * @ordered
+	 */
+	CONCURRENT_LITERAL(2, "concurrent", "concurrent"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Sequential</b></em>' literal value.
@@ -76,39 +105,6 @@
 	public static final int CONCURRENT = 2;
 
 	/**
-	 * The '<em><b>Sequential</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SEQUENTIAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final CallConcurrencyKind SEQUENTIAL_LITERAL = new CallConcurrencyKind(
-		SEQUENTIAL, "sequential", "sequential"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Guarded</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #GUARDED
-	 * @generated
-	 * @ordered
-	 */
-	public static final CallConcurrencyKind GUARDED_LITERAL = new CallConcurrencyKind(
-		GUARDED, "guarded", "guarded"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Concurrent</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CONCURRENT
-	 * @generated
-	 * @ordered
-	 */
-	public static final CallConcurrencyKind CONCURRENT_LITERAL = new CallConcurrencyKind(
-		CONCURRENT, "concurrent", "concurrent"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Call Concurrency Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -123,8 +119,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<CallConcurrencyKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Call Concurrency Kind</b></em>' literal with the specified literal value.
@@ -177,13 +173,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private CallConcurrencyKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //CallConcurrencyKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallOperationAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallOperationAction.java
index 4132cb8..e1a161d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallOperationAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CallOperationAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallOperationAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: CallOperationAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -128,7 +128,7 @@
 	 * @generated
 	 */
 	boolean validateArgumentPinEqualParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -141,7 +141,7 @@
 	 * @generated
 	 */
 	boolean validateResultPinEqualParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -153,6 +153,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeTargetPin(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeTargetPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CallOperationAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Class.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Class.java
index e1d553b..5f15a3f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Class.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Class.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Class.java,v 1.13 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Class.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -66,7 +66,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" opposite="class" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedOperations();
+	EList<Operation> getOwnedOperations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Operation}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -79,8 +79,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation createOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -93,8 +93,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -109,8 +109,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -126,7 +126,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getNestedClassifiers();
+	EList<Classifier> getNestedClassifiers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Classifier}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Classifier</b></em>' containment reference list.
@@ -179,7 +179,7 @@
 	 * @model type="org.eclipse.uml2.uml.Class" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getSuperClasses();
+	EList<Class> getSuperClasses();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Class} with the specified '<em><b>Name</b></em>' from the '<em><b>Super Class</b></em>' reference list.
@@ -244,7 +244,7 @@
 	 * @model type="org.eclipse.uml2.uml.Reception" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedReceptions();
+	EList<Reception> getOwnedReceptions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Reception}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -257,8 +257,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception createOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Reception createOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Reception} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -271,8 +271,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Reception getOwnedReception(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Reception} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -287,8 +287,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Reception getOwnedReception(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -306,7 +306,7 @@
 	 * @model type="org.eclipse.uml2.uml.Extension" opposite="metaclass" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getExtensions();
+	EList<Extension> getExtensions();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Extension} with the specified '<em><b>Name</b></em>' from the '<em><b>Extension</b></em>' reference list.
@@ -341,7 +341,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePassiveClass(DiagnosticChain diagnostics, Map context);
+	boolean validatePassiveClass(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -352,8 +353,8 @@
 	 * @model required="true" ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false" returnTypeOrdered="false"
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType);
+	Operation createOwnedOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Classifier.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Classifier.java
index ce0603e..fddf437 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Classifier.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Classifier.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Classifier.java,v 1.19 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Classifier.java,v 1.20 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -100,7 +100,7 @@
 	 * @model type="org.eclipse.uml2.uml.Generalization" opposite="specific" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getGeneralizations();
+	EList<Generalization> getGeneralizations();
 
 	/**
 	 * Returns the value of the '<em><b>Powertype Extent</b></em>' reference list.
@@ -117,7 +117,7 @@
 	 * @model type="org.eclipse.uml2.uml.GeneralizationSet" opposite="powertype" ordered="false"
 	 * @generated
 	 */
-	EList getPowertypeExtents();
+	EList<GeneralizationSet> getPowertypeExtents();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.GeneralizationSet} with the specified '<em><b>Name</b></em>' from the '<em><b>Powertype Extent</b></em>' reference list.
@@ -158,7 +158,7 @@
 	 * @model type="org.eclipse.uml2.uml.Feature" opposite="featuringClassifier" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getFeatures();
+	EList<Feature> getFeatures();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Feature} with the specified '<em><b>Name</b></em>' from the '<em><b>Feature</b></em>' reference list.
@@ -197,7 +197,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getInheritedMembers();
+	EList<NamedElement> getInheritedMembers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Inherited Member</b></em>' reference list.
@@ -237,7 +237,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedClassifiers();
+	EList<Classifier> getRedefinedClassifiers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Classifier</b></em>' reference list.
@@ -278,7 +278,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getGenerals();
+	EList<Classifier> getGenerals();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>General</b></em>' reference list.
@@ -317,7 +317,7 @@
 	 * @model type="org.eclipse.uml2.uml.UseCase" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedUseCases();
+	EList<UseCase> getOwnedUseCases();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.UseCase}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Use Case</b></em>' containment reference list.
@@ -370,7 +370,7 @@
 	 * @model type="org.eclipse.uml2.uml.UseCase" opposite="subject" ordered="false"
 	 * @generated
 	 */
-	EList getUseCases();
+	EList<UseCase> getUseCases();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.UseCase} with the specified '<em><b>Name</b></em>' from the '<em><b>Use Case</b></em>' reference list.
@@ -410,7 +410,7 @@
 	 * @model type="org.eclipse.uml2.uml.Substitution" opposite="substitutingClassifier" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getSubstitutions();
+	EList<Substitution> getSubstitutions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Substitution}, with the specified '<em><b>Name</b></em>', and '<em><b>Contract</b></em>', and appends it to the '<em><b>Substitution</b></em>' containment reference list.
@@ -464,7 +464,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getAttributes();
+	EList<Property> getAttributes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Property} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Attribute</b></em>' reference list.
@@ -542,7 +542,7 @@
 	 * @model type="org.eclipse.uml2.uml.CollaborationUse" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getCollaborationUses();
+	EList<CollaborationUse> getCollaborationUses();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.CollaborationUse}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Collaboration Use</b></em>' containment reference list.
@@ -591,7 +591,7 @@
 	 * @generated
 	 */
 	boolean validateNoCyclesInGeneralization(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -603,7 +603,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSpecializeType(DiagnosticChain diagnostics, Map context);
+	boolean validateSpecializeType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -616,7 +617,7 @@
 	 * @generated
 	 */
 	boolean validateGeneralizationHierarchies(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -629,7 +630,7 @@
 	 * @generated
 	 */
 	boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Generalization}, with the specified '<em><b>General</b></em>', and appends it to the '<em><b>Generalization</b></em>' containment reference list.
@@ -674,7 +675,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Property" ordered="false"
 	 * @generated
 	 */
-	EList getAllAttributes();
+	EList<Property> getAllAttributes();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -685,7 +686,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Operation" ordered="false"
 	 * @generated
 	 */
-	EList getOperations();
+	EList<Operation> getOperations();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -696,7 +697,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Operation" ordered="false"
 	 * @generated
 	 */
-	EList getAllOperations();
+	EList<Operation> getAllOperations();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -707,8 +708,8 @@
 	 * @model ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false"
 	 * @generated
 	 */
-	Operation getOperation(String name, EList parameterNames,
-			EList parameterTypes);
+	Operation getOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -719,8 +720,8 @@
 	 * @model ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false" ignoreCaseDataType="org.eclipse.uml2.uml.Boolean" ignoreCaseRequired="true" ignoreCaseOrdered="false"
 	 * @generated
 	 */
-	Operation getOperation(String name, EList parameterNames,
-			EList parameterTypes, boolean ignoreCase);
+	Operation getOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, boolean ignoreCase);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -731,7 +732,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Interface" ordered="false"
 	 * @generated
 	 */
-	EList getUsedInterfaces();
+	EList<Interface> getUsedInterfaces();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -742,7 +743,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Interface" ordered="false"
 	 * @generated
 	 */
-	EList getAllUsedInterfaces();
+	EList<Interface> getAllUsedInterfaces();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -766,7 +767,7 @@
 	 * @model type="org.eclipse.uml2.uml.Feature" ordered="false"
 	 * @generated
 	 */
-	EList allFeatures();
+	EList<Feature> allFeatures();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -778,7 +779,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList parents();
+	EList<Classifier> parents();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -791,7 +792,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" ordered="false" cRequired="true" cOrdered="false"
 	 * @generated
 	 */
-	EList inheritableMembers(Classifier c);
+	EList<NamedElement> inheritableMembers(Classifier c);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -829,7 +830,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" ordered="false" inhsType="org.eclipse.uml2.uml.NamedElement" inhsMany="true" inhsOrdered="false"
 	 * @generated
 	 */
-	EList inherit(EList inhs);
+	EList<NamedElement> inherit(EList<NamedElement> inhs);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -841,6 +842,6 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList allParents();
+	EList<Classifier> allParents();
 
 } // Classifier
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClassifierTemplateParameter.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClassifierTemplateParameter.java
index 0626894..abc9dd2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClassifierTemplateParameter.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClassifierTemplateParameter.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassifierTemplateParameter.java,v 1.5 2006/05/12 20:38:03 khussey Exp $
+ * $Id: ClassifierTemplateParameter.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -128,6 +128,6 @@
 	 * @generated
 	 */
 	boolean validateHasConstrainingClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ClassifierTemplateParameter
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Clause.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Clause.java
index c429972..e23158c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Clause.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Clause.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Clause.java,v 1.5 2006/02/22 20:48:15 khussey Exp $
+ * $Id: Clause.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -61,7 +61,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" ordered="false"
 	 * @generated
 	 */
-	EList getTests();
+	EList<ExecutableNode> getTests();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExecutableNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Test</b></em>' reference list.
@@ -100,7 +100,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" ordered="false"
 	 * @generated
 	 */
-	EList getBodies();
+	EList<ExecutableNode> getBodies();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExecutableNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Body</b></em>' reference list.
@@ -141,7 +141,7 @@
 	 * @model type="org.eclipse.uml2.uml.Clause" opposite="successorClause" ordered="false"
 	 * @generated
 	 */
-	EList getPredecessorClauses();
+	EList<Clause> getPredecessorClauses();
 
 	/**
 	 * Returns the value of the '<em><b>Successor Clause</b></em>' reference list.
@@ -158,7 +158,7 @@
 	 * @model type="org.eclipse.uml2.uml.Clause" opposite="predecessorClause" ordered="false"
 	 * @generated
 	 */
-	EList getSuccessorClauses();
+	EList<Clause> getSuccessorClauses();
 
 	/**
 	 * Returns the value of the '<em><b>Decider</b></em>' reference.
@@ -198,7 +198,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin"
 	 * @generated
 	 */
-	EList getBodyOutputs();
+	EList<OutputPin> getBodyOutputs();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.OutputPin} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Body Output</b></em>' reference list.
@@ -235,7 +235,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeciderOutput(DiagnosticChain diagnostics, Map context);
+	boolean validateDeciderOutput(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -247,6 +248,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBodyOutputPins(DiagnosticChain diagnostics, Map context);
+	boolean validateBodyOutputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Clause
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClearAssociationAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClearAssociationAction.java
index 68429ea..eacb3b8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClearAssociationAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ClearAssociationAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClearAssociationAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ClearAssociationAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -127,7 +127,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -139,6 +140,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ClearAssociationAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Collaboration.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Collaboration.java
index d09fd3c..dde6210 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Collaboration.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Collaboration.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Collaboration.java,v 1.5 2006/05/12 20:38:05 khussey Exp $
+ * $Id: Collaboration.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -52,7 +52,7 @@
 	 * @model type="org.eclipse.uml2.uml.ConnectableElement" ordered="false"
 	 * @generated
 	 */
-	EList getCollaborationRoles();
+	EList<ConnectableElement> getCollaborationRoles();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ConnectableElement} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Collaboration Role</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CollaborationUse.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CollaborationUse.java
index 410270a..fc60217 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CollaborationUse.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CollaborationUse.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CollaborationUse.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: CollaborationUse.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -84,7 +84,7 @@
 	 * @model type="org.eclipse.uml2.uml.Dependency" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getRoleBindings();
+	EList<Dependency> getRoleBindings();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Dependency}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Role Binding</b></em>' containment reference list.
@@ -145,7 +145,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateClientElements(DiagnosticChain diagnostics, Map context);
+	boolean validateClientElements(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -157,7 +158,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEveryRole(DiagnosticChain diagnostics, Map context);
+	boolean validateEveryRole(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -169,6 +171,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConnectors(DiagnosticChain diagnostics, Map context);
+	boolean validateConnectors(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CollaborationUse
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CombinedFragment.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CombinedFragment.java
index dc43eaf..af1aab9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CombinedFragment.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CombinedFragment.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CombinedFragment.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: CombinedFragment.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -85,7 +85,7 @@
 	 * @model type="org.eclipse.uml2.uml.InteractionOperand" containment="true" resolveProxies="true" required="true"
 	 * @generated
 	 */
-	EList getOperands();
+	EList<InteractionOperand> getOperands();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InteractionOperand}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Operand</b></em>' containment reference list.
@@ -136,7 +136,7 @@
 	 * @model type="org.eclipse.uml2.uml.Gate" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getCfragmentGates();
+	EList<Gate> getCfragmentGates();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Gate}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Cfragment Gate</b></em>' containment reference list.
@@ -184,7 +184,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOptLoopBreakNeg(DiagnosticChain diagnostics, Map context);
+	boolean validateOptLoopBreakNeg(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -196,7 +197,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMinintAndMaxint(DiagnosticChain diagnostics, Map context);
+	boolean validateMinintAndMaxint(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -208,7 +210,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBreak(DiagnosticChain diagnostics, Map context);
+	boolean validateBreak(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -220,6 +223,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConsiderAndIgnore(DiagnosticChain diagnostics, Map context);
+	boolean validateConsiderAndIgnore(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CombinedFragment
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Comment.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Comment.java
index 572206b..0239896 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Comment.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Comment.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Comment.java,v 1.5 2006/05/12 20:38:04 khussey Exp $
+ * $Id: Comment.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -104,6 +104,6 @@
 	 * @model type="org.eclipse.uml2.uml.Element" ordered="false"
 	 * @generated
 	 */
-	EList getAnnotatedElements();
+	EList<Element> getAnnotatedElements();
 
 } // Comment
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Component.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Component.java
index c6f1af9..0ea1457 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Component.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Component.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Component.java,v 1.19 2006/10/10 20:41:28 khussey Exp $
+ * $Id: Component.java,v 1.20 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -83,7 +83,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRequireds();
+	EList<Interface> getRequireds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Interface} with the specified '<em><b>Name</b></em>' from the '<em><b>Required</b></em>' reference list.
@@ -121,7 +121,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getProvideds();
+	EList<Interface> getProvideds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Interface} with the specified '<em><b>Name</b></em>' from the '<em><b>Provided</b></em>' reference list.
@@ -159,7 +159,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPackagedElements();
+	EList<PackageableElement> getPackagedElements();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.PackageableElement}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Packaged Element</b></em>' containment reference list.
@@ -214,7 +214,7 @@
 	 * @model type="org.eclipse.uml2.uml.ComponentRealization" opposite="abstraction" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getRealizations();
+	EList<ComponentRealization> getRealizations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ComponentRealization}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Realization</b></em>' containment reference list.
@@ -308,7 +308,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" ordered="false" classifierRequired="true" classifierOrdered="false"
 	 * @generated
 	 */
-	EList realizedInterfaces(Classifier classifier);
+	EList<Interface> realizedInterfaces(Classifier classifier);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -322,6 +322,6 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" ordered="false" classifierRequired="true" classifierOrdered="false"
 	 * @generated
 	 */
-	EList usedInterfaces(Classifier classifier);
+	EList<Interface> usedInterfaces(Classifier classifier);
 
 } // Component
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConditionalNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConditionalNode.java
index 95d10ba..218cfd0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConditionalNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConditionalNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConditionalNode.java,v 1.10 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ConditionalNode.java,v 1.11 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -109,7 +109,7 @@
 	 * @model type="org.eclipse.uml2.uml.Clause" containment="true" resolveProxies="true" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getClauses();
+	EList<Clause> getClauses();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Clause} and appends it to the '<em><b>Clause</b></em>' containment reference list.
@@ -134,7 +134,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getResults();
+	EList<OutputPin> getResults();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Result</b></em>' containment reference list.
@@ -185,6 +185,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateResultNoIncoming(DiagnosticChain diagnostics, Map context);
+	boolean validateResultNoIncoming(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ConditionalNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectableElement.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectableElement.java
index 8e2ba03..85fc20d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectableElement.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectableElement.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectableElement.java,v 1.4 2006/05/12 20:38:04 khussey Exp $
+ * $Id: ConnectableElement.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -53,6 +53,6 @@
 	 * @model type="org.eclipse.uml2.uml.ConnectorEnd" opposite="role"
 	 * @generated
 	 */
-	EList getEnds();
+	EList<ConnectorEnd> getEnds();
 
 } // ConnectableElement
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectionPointReference.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectionPointReference.java
index 04eddbe..5d9cd39 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectionPointReference.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectionPointReference.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectionPointReference.java,v 1.6 2006/05/12 20:38:09 khussey Exp $
+ * $Id: ConnectionPointReference.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.Pseudostate" ordered="false"
 	 * @generated
 	 */
-	EList getEntries();
+	EList<Pseudostate> getEntries();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Pseudostate} with the specified '<em><b>Name</b></em>' from the '<em><b>Entry</b></em>' reference list.
@@ -94,7 +94,7 @@
 	 * @model type="org.eclipse.uml2.uml.Pseudostate" ordered="false"
 	 * @generated
 	 */
-	EList getExits();
+	EList<Pseudostate> getExits();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Pseudostate} with the specified '<em><b>Name</b></em>' from the '<em><b>Exit</b></em>' reference list.
@@ -156,7 +156,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEntryPseudostates(DiagnosticChain diagnostics, Map context);
+	boolean validateEntryPseudostates(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -168,6 +169,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateExitPseudostates(DiagnosticChain diagnostics, Map context);
+	boolean validateExitPseudostates(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ConnectionPointReference
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Connector.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Connector.java
index 2ef3ea5..bc37a54 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Connector.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Connector.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Connector.java,v 1.13 2006/10/10 20:41:28 khussey Exp $
+ * $Id: Connector.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -87,7 +87,7 @@
 	 * @model type="org.eclipse.uml2.uml.Connector" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedConnectors();
+	EList<Connector> getRedefinedConnectors();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Connector} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Connector</b></em>' reference list.
@@ -125,7 +125,7 @@
 	 * @model type="org.eclipse.uml2.uml.ConnectorEnd" containment="true" resolveProxies="true" lower="2"
 	 * @generated
 	 */
-	EList getEnds();
+	EList<ConnectorEnd> getEnds();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ConnectorEnd} and appends it to the '<em><b>End</b></em>' containment reference list.
@@ -205,7 +205,7 @@
 	 * @model type="org.eclipse.uml2.uml.Behavior" ordered="false"
 	 * @generated
 	 */
-	EList getContracts();
+	EList<Behavior> getContracts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Behavior} with the specified '<em><b>Name</b></em>' from the '<em><b>Contract</b></em>' reference list.
@@ -241,7 +241,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypes(DiagnosticChain diagnostics, Map context);
+	boolean validateTypes(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -253,7 +254,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCompatible(DiagnosticChain diagnostics, Map context);
+	boolean validateCompatible(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -265,7 +267,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateRoles(DiagnosticChain diagnostics, Map context);
+	boolean validateRoles(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -278,7 +281,7 @@
 	 * @generated
 	 */
 	boolean validateBetweenInterfacesPorts(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -291,7 +294,7 @@
 	 * @generated
 	 */
 	boolean validateBetweenInterfacePortImplements(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -304,7 +307,7 @@
 	 * @generated
 	 */
 	boolean validateBetweenInterfacePortSignature(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -317,7 +320,7 @@
 	 * @generated
 	 */
 	boolean validateUnionSignatureCompatible(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -329,6 +332,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssemblyConnector(DiagnosticChain diagnostics, Map context);
+	boolean validateAssemblyConnector(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Connector
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorEnd.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorEnd.java
index c0ba5bb..37e7527 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorEnd.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorEnd.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorEnd.java,v 1.2 2006/04/05 13:49:57 khussey Exp $
+ * $Id: ConnectorEnd.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -119,7 +119,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -131,7 +132,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePartWithPortEmpty(DiagnosticChain diagnostics, Map context);
+	boolean validatePartWithPortEmpty(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -143,7 +145,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateRoleAndPartWithPort(DiagnosticChain diagnostics, Map context);
+	boolean validateRoleAndPartWithPort(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -155,6 +158,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSelfPartWithPort(DiagnosticChain diagnostics, Map context);
+	boolean validateSelfPartWithPort(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ConnectorEnd
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorKind.java
index 566ff1a..53f3ae1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConnectorKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorKind.java,v 1.3 2006/05/12 20:38:04 khussey Exp $
+ * $Id: ConnectorKind.java,v 1.4 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,27 @@
  * @model
  * @generated
  */
-public final class ConnectorKind
-		extends AbstractEnumerator {
+public enum ConnectorKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Assembly</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSEMBLY
+	 * @generated
+	 * @ordered
+	 */
+	ASSEMBLY_LITERAL(0, "assembly", "assembly"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Delegation</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DELEGATION
+	 * @generated
+	 * @ordered
+	 */
+	DELEGATION_LITERAL(1, "delegation", "delegation"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Assembly</b></em>' literal value.
@@ -62,28 +81,6 @@
 	public static final int DELEGATION = 1;
 
 	/**
-	 * The '<em><b>Assembly</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ASSEMBLY
-	 * @generated
-	 * @ordered
-	 */
-	public static final ConnectorKind ASSEMBLY_LITERAL = new ConnectorKind(
-		ASSEMBLY, "assembly", "assembly"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Delegation</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #DELEGATION
-	 * @generated
-	 * @ordered
-	 */
-	public static final ConnectorKind DELEGATION_LITERAL = new ConnectorKind(
-		DELEGATION, "delegation", "delegation"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Connector Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -98,8 +95,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<ConnectorKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Connector Kind</b></em>' literal with the specified literal value.
@@ -150,13 +147,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private ConnectorKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //ConnectorKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConsiderIgnoreFragment.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConsiderIgnoreFragment.java
index 11d543d..02ec459 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConsiderIgnoreFragment.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ConsiderIgnoreFragment.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConsiderIgnoreFragment.java,v 1.4 2006/05/12 20:38:10 khussey Exp $
+ * $Id: ConsiderIgnoreFragment.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" ordered="false"
 	 * @generated
 	 */
-	EList getMessages();
+	EList<NamedElement> getMessages();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Message</b></em>' reference list.
@@ -92,7 +92,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConsiderOrIgnore(DiagnosticChain diagnostics, Map context);
+	boolean validateConsiderOrIgnore(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -104,6 +105,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateType(DiagnosticChain diagnostics, Map context);
+	boolean validateType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ConsiderIgnoreFragment
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Constraint.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Constraint.java
index f9fe526..20058f3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Constraint.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Constraint.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Constraint.java,v 1.10 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Constraint.java,v 1.11 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.Element"
 	 * @generated
 	 */
-	EList getConstrainedElements();
+	EList<Element> getConstrainedElements();
 
 	/**
 	 * Returns the value of the '<em><b>Specification</b></em>' containment reference.
@@ -135,7 +135,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotApplyToSelf(DiagnosticChain diagnostics, Map context);
+	boolean validateNotApplyToSelf(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -148,7 +149,7 @@
 	 * @generated
 	 */
 	boolean validateValueSpecificationBoolean(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -160,7 +161,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBooleanValue(DiagnosticChain diagnostics, Map context);
+	boolean validateBooleanValue(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -172,7 +174,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoSideEffects(DiagnosticChain diagnostics, Map context);
+	boolean validateNoSideEffects(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -184,6 +187,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotAppliedToSelf(DiagnosticChain diagnostics, Map context);
+	boolean validateNotAppliedToSelf(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Constraint
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Continuation.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Continuation.java
index b72409b..31bb0b9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Continuation.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Continuation.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Continuation.java,v 1.4 2006/05/12 20:38:08 khussey Exp $
+ * $Id: Continuation.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -75,7 +75,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameName(DiagnosticChain diagnostics, Map context);
+	boolean validateSameName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -87,7 +88,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGlobal(DiagnosticChain diagnostics, Map context);
+	boolean validateGlobal(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -100,6 +102,6 @@
 	 * @generated
 	 */
 	boolean validateFirstOrLastInteractionFragment(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // Continuation
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ControlFlow.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ControlFlow.java
index a254d77..eed83d0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ControlFlow.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ControlFlow.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ControlFlow.java,v 1.2 2006/05/12 20:38:07 khussey Exp $
+ * $Id: ControlFlow.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,6 +43,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateObjectNodes(DiagnosticChain diagnostics, Map context);
+	boolean validateObjectNodes(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ControlFlow
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkAction.java
index 5d98d92..acdffe0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkAction.java,v 1.3 2006/05/12 20:38:04 khussey Exp $
+ * $Id: CreateLinkAction.java,v 1.4 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,6 +44,6 @@
 	 * @generated
 	 */
 	boolean validateAssociationNotAbstract(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // CreateLinkAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkObjectAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkObjectAction.java
index 2580119..d450f6e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkObjectAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateLinkObjectAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkObjectAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: CreateLinkObjectAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -86,7 +86,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssociationClass(DiagnosticChain diagnostics, Map context);
+	boolean validateAssociationClass(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,7 +99,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeOfResult(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeOfResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -110,6 +112,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CreateLinkObjectAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateObjectAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateObjectAction.java
index 4372eda..0f9be04 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateObjectAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreateObjectAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateObjectAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: CreateObjectAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -113,7 +113,7 @@
 	 * @generated
 	 */
 	boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -126,7 +126,7 @@
 	 * @generated
 	 */
 	boolean validateClassifierNotAssociationClass(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -138,7 +138,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -150,6 +151,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CreateObjectAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreationEvent.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreationEvent.java
index 44d9322..c1782f1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreationEvent.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/CreationEvent.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreationEvent.java,v 1.2 2006/05/12 20:38:05 khussey Exp $
+ * $Id: CreationEvent.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,6 +43,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoOccurrenceAbove(DiagnosticChain diagnostics, Map context);
+	boolean validateNoOccurrenceAbove(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // CreationEvent
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DataType.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DataType.java
index ac98b4c..ae2eaf7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DataType.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DataType.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DataType.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: DataType.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" opposite="datatype" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedAttributes();
+	EList<Property> getOwnedAttributes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Attribute</b></em>' containment reference list.
@@ -125,7 +125,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" opposite="datatype" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedOperations();
+	EList<Operation> getOwnedOperations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Operation}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -138,8 +138,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation createOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -152,8 +152,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -168,8 +168,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -181,8 +181,8 @@
 	 * @model required="true" ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false" returnTypeOrdered="false"
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType);
+	Operation createOwnedOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DecisionNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DecisionNode.java
index 6370d26..ff104cd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DecisionNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DecisionNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DecisionNode.java,v 1.2 2006/05/12 20:38:09 khussey Exp $
+ * $Id: DecisionNode.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,7 +74,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneIncomingEdge(DiagnosticChain diagnostics, Map context);
+	boolean validateOneIncomingEdge(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -86,7 +87,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInputParameter(DiagnosticChain diagnostics, Map context);
+	boolean validateInputParameter(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,6 +100,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // DecisionNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Dependency.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Dependency.java
index 9bd67cd..b0a607a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Dependency.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Dependency.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Dependency.java,v 1.3 2006/02/22 20:48:15 khussey Exp $
+ * $Id: Dependency.java,v 1.4 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -53,7 +53,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getSuppliers();
+	EList<NamedElement> getSuppliers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Supplier</b></em>' reference list.
@@ -94,7 +94,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" opposite="clientDependency" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getClients();
+	EList<NamedElement> getClients();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Client</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Deployment.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Deployment.java
index 00cd6ac..24c74a4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Deployment.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Deployment.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Deployment.java,v 1.7 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Deployment.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.DeployedArtifact" ordered="false"
 	 * @generated
 	 */
-	EList getDeployedArtifacts();
+	EList<DeployedArtifact> getDeployedArtifacts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.DeployedArtifact} with the specified '<em><b>Name</b></em>' from the '<em><b>Deployed Artifact</b></em>' reference list.
@@ -97,7 +97,7 @@
 	 * @model type="org.eclipse.uml2.uml.DeploymentSpecification" opposite="deployment" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConfigurations();
+	EList<DeploymentSpecification> getConfigurations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.DeploymentSpecification}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Configuration</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentSpecification.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentSpecification.java
index 83fb102..e448b76 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentSpecification.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentSpecification.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentSpecification.java,v 1.7 2006/05/12 20:38:07 khussey Exp $
+ * $Id: DeploymentSpecification.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -183,7 +183,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeployedElements(DiagnosticChain diagnostics, Map context);
+	boolean validateDeployedElements(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -195,6 +196,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeploymentTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateDeploymentTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // DeploymentSpecification
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentTarget.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentTarget.java
index 9e98d49..b44fa76 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentTarget.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DeploymentTarget.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentTarget.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: DeploymentTarget.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.Deployment" opposite="location" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getDeployments();
+	EList<Deployment> getDeployments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Deployment}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Deployment</b></em>' containment reference list.
@@ -106,7 +106,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getDeployedElements();
+	EList<PackageableElement> getDeployedElements();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.PackageableElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Deployed Element</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestroyObjectAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestroyObjectAction.java
index 9d74c41..ec78b9f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestroyObjectAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestroyObjectAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestroyObjectAction.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: DestroyObjectAction.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -155,7 +155,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -167,6 +168,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoType(DiagnosticChain diagnostics, Map context);
+	boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // DestroyObjectAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestructionEvent.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestructionEvent.java
index 872462e..6bd8b94 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestructionEvent.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DestructionEvent.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestructionEvent.java,v 1.2 2006/05/12 20:38:05 khussey Exp $
+ * $Id: DestructionEvent.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,6 +44,6 @@
 	 * @generated
 	 */
 	boolean validateNoOccurrenceSpecificationsBelow(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 } // DestructionEvent
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DirectedRelationship.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DirectedRelationship.java
index 4585e7a..0c1bb56 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DirectedRelationship.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DirectedRelationship.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DirectedRelationship.java,v 1.4 2006/05/24 20:54:29 khussey Exp $
+ * $Id: DirectedRelationship.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -51,7 +51,7 @@
 	 * @model type="org.eclipse.uml2.uml.Element" required="true" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getSources();
+	EList<Element> getSources();
 
 	/**
 	 * Returns the value of the '<em><b>Target</b></em>' reference list.
@@ -66,6 +66,6 @@
 	 * @model type="org.eclipse.uml2.uml.Element" required="true" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getTargets();
+	EList<Element> getTargets();
 
 } // DirectedRelationship
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Duration.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Duration.java
index 54d5fc9..0ccca13 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Duration.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Duration.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Duration.java,v 1.6 2006/05/12 20:38:03 khussey Exp $
+ * $Id: Duration.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -78,7 +78,7 @@
 	 * @model type="org.eclipse.uml2.uml.Observation" ordered="false"
 	 * @generated
 	 */
-	EList getObservations();
+	EList<Observation> getObservations();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Observation} with the specified '<em><b>Name</b></em>' from the '<em><b>Observation</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationConstraint.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationConstraint.java
index 5e7a4dd..29627a4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationConstraint.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationConstraint.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationConstraint.java,v 1.6 2006/05/12 20:38:05 khussey Exp $
+ * $Id: DurationConstraint.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -53,7 +53,7 @@
 	 * @model type="boolean" default="true" dataType="org.eclipse.uml2.uml.Boolean" upper="2" ordered="false"
 	 * @generated
 	 */
-	EList getFirstEvents();
+	EList<Boolean> getFirstEvents();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -67,6 +67,6 @@
 	 * @generated
 	 */
 	boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // DurationConstraint
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationObservation.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationObservation.java
index 68dec1b..ea969d5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationObservation.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/DurationObservation.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationObservation.java,v 1.5 2006/04/05 13:49:57 khussey Exp $
+ * $Id: DurationObservation.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" required="true" upper="2" ordered="false"
 	 * @generated
 	 */
-	EList getEvents();
+	EList<NamedElement> getEvents();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Event</b></em>' reference list.
@@ -95,7 +95,7 @@
 	 * @model type="boolean" default="true" dataType="org.eclipse.uml2.uml.Boolean" upper="2" ordered="false"
 	 * @generated
 	 */
-	EList getFirstEvents();
+	EList<Boolean> getFirstEvents();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -109,6 +109,6 @@
 	 * @generated
 	 */
 	boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // DurationObservation
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Element.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Element.java
index f1f33f5..781276c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Element.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Element.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Element.java,v 1.15 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Element.java,v 1.16 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -63,7 +63,7 @@
 	 * @model type="org.eclipse.uml2.uml.Element" opposite="owner" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedElements();
+	EList<Element> getOwnedElements();
 
 	/**
 	 * Returns the value of the '<em><b>Owner</b></em>' reference.
@@ -94,7 +94,7 @@
 	 * @model type="org.eclipse.uml2.uml.Comment" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedComments();
+	EList<Comment> getOwnedComments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Comment} and appends it to the '<em><b>Owned Comment</b></em>' containment reference list.
@@ -116,7 +116,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotOwnSelf(DiagnosticChain diagnostics, Map context);
+	boolean validateNotOwnSelf(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -128,7 +129,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHasOwner(DiagnosticChain diagnostics, Map context);
+	boolean validateHasOwner(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -139,7 +141,7 @@
 	 * @model kind="operation" type="org.eclipse.emf.ecore.EObject" ordered="false"
 	 * @generated
 	 */
-	EList getStereotypeApplications();
+	EList<EObject> getStereotypeApplications();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -161,7 +163,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Stereotype" ordered="false"
 	 * @generated
 	 */
-	EList getRequiredStereotypes();
+	EList<Stereotype> getRequiredStereotypes();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -183,7 +185,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Stereotype" ordered="false"
 	 * @generated
 	 */
-	EList getAppliedStereotypes();
+	EList<Stereotype> getAppliedStereotypes();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -205,7 +207,7 @@
 	 * @model type="org.eclipse.uml2.uml.Stereotype" ordered="false" stereotypeRequired="true" stereotypeOrdered="false"
 	 * @generated
 	 */
-	EList getAppliedSubstereotypes(Stereotype stereotype);
+	EList<Stereotype> getAppliedSubstereotypes(Stereotype stereotype);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -272,7 +274,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Relationship" ordered="false"
 	 * @generated
 	 */
-	EList getRelationships();
+	EList<Relationship> getRelationships();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -283,7 +285,7 @@
 	 * @model type="org.eclipse.uml2.uml.Relationship" ordered="false" eClassRequired="true" eClassOrdered="false"
 	 * @generated
 	 */
-	EList getRelationships(EClass eClass);
+	EList<Relationship> getRelationships(EClass eClass);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -294,7 +296,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.DirectedRelationship" ordered="false"
 	 * @generated
 	 */
-	EList getSourceDirectedRelationships();
+	EList<DirectedRelationship> getSourceDirectedRelationships();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -305,7 +307,7 @@
 	 * @model type="org.eclipse.uml2.uml.DirectedRelationship" ordered="false" eClassRequired="true" eClassOrdered="false"
 	 * @generated
 	 */
-	EList getSourceDirectedRelationships(EClass eClass);
+	EList<DirectedRelationship> getSourceDirectedRelationships(EClass eClass);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -316,7 +318,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.DirectedRelationship" ordered="false"
 	 * @generated
 	 */
-	EList getTargetDirectedRelationships();
+	EList<DirectedRelationship> getTargetDirectedRelationships();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -327,7 +329,7 @@
 	 * @model type="org.eclipse.uml2.uml.DirectedRelationship" ordered="false" eClassRequired="true" eClassOrdered="false"
 	 * @generated
 	 */
-	EList getTargetDirectedRelationships(EClass eClass);
+	EList<DirectedRelationship> getTargetDirectedRelationships(EClass eClass);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -338,7 +340,7 @@
 	 * @model kind="operation" type="java.lang.String" dataType="org.eclipse.uml2.uml.String" ordered="false"
 	 * @generated
 	 */
-	EList getKeywords();
+	EList<String> getKeywords();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -448,7 +450,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Stereotype" ordered="false"
 	 * @generated
 	 */
-	EList getApplicableStereotypes();
+	EList<Stereotype> getApplicableStereotypes();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -493,7 +495,7 @@
 	 * @model type="org.eclipse.uml2.uml.Element" ordered="false"
 	 * @generated
 	 */
-	EList allOwnedElements();
+	EList<Element> allOwnedElements();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ElementImport.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ElementImport.java
index 60d1eb2..2d84823 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ElementImport.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ElementImport.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ElementImport.java,v 1.7 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ElementImport.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -186,7 +186,7 @@
 	 * @generated
 	 */
 	boolean validateVisibilityPublicOrPrivate(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -199,7 +199,7 @@
 	 * @generated
 	 */
 	boolean validateImportedElementIsPublic(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/EncapsulatedClassifier.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/EncapsulatedClassifier.java
index c6ef7f6..326e701 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/EncapsulatedClassifier.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/EncapsulatedClassifier.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: EncapsulatedClassifier.java,v 1.7 2006/05/12 20:38:08 khussey Exp $
+ * $Id: EncapsulatedClassifier.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -50,7 +50,7 @@
 	 * @model type="org.eclipse.uml2.uml.Port" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedPorts();
+	EList<Port> getOwnedPorts();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Port}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Port</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Enumeration.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Enumeration.java
index 2c3b8dd..f564c96 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Enumeration.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Enumeration.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Enumeration.java,v 1.8 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Enumeration.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -52,7 +52,7 @@
 	 * @model type="org.eclipse.uml2.uml.EnumerationLiteral" opposite="enumeration" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedLiterals();
+	EList<EnumerationLiteral> getOwnedLiterals();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.EnumerationLiteral} with the specified '<em><b>Name</b></em>' from the '<em><b>Owned Literal</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExceptionHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExceptionHandler.java
index 4c81798..19f30db 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExceptionHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExceptionHandler.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExceptionHandler.java,v 1.5 2006/03/15 19:33:55 khussey Exp $
+ * $Id: ExceptionHandler.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -109,7 +109,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getExceptionTypes();
+	EList<Classifier> getExceptionTypes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Exception Type</b></em>' reference list.
@@ -172,7 +172,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateExceptionBody(DiagnosticChain diagnostics, Map context);
+	boolean validateExceptionBody(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -184,7 +185,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateResultPins(DiagnosticChain diagnostics, Map context);
+	boolean validateResultPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -196,7 +198,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneInput(DiagnosticChain diagnostics, Map context);
+	boolean validateOneInput(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -208,6 +211,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEdgeSourceTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateEdgeSourceTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ExceptionHandler
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutableNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutableNode.java
index eab2814..c1c5562 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutableNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutableNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutableNode.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ExecutableNode.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -52,7 +52,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExceptionHandler" opposite="protectedNode" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getHandlers();
+	EList<ExceptionHandler> getHandlers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ExceptionHandler} and appends it to the '<em><b>Handler</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutionSpecification.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutionSpecification.java
index 146bad3..6b255dc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutionSpecification.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExecutionSpecification.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionSpecification.java,v 1.3 2006/05/12 20:38:09 khussey Exp $
+ * $Id: ExecutionSpecification.java,v 1.4 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -100,6 +100,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameLifeline(DiagnosticChain diagnostics, Map context);
+	boolean validateSameLifeline(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ExecutionSpecification
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionKind.java
index d47289c..3bf54cd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpansionKind.java,v 1.1 2005/11/14 22:25:59 khussey Exp $
+ * $Id: ExpansionKind.java,v 1.2 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,37 @@
  * @model
  * @generated
  */
-public final class ExpansionKind
-		extends AbstractEnumerator {
+public enum ExpansionKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Parallel</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PARALLEL
+	 * @generated
+	 * @ordered
+	 */
+	PARALLEL_LITERAL(0, "parallel", "parallel"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Iterative</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ITERATIVE
+	 * @generated
+	 * @ordered
+	 */
+	ITERATIVE_LITERAL(1, "iterative", "iterative"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Stream</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STREAM
+	 * @generated
+	 * @ordered
+	 */
+	STREAM_LITERAL(2, "stream", "stream"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Parallel</b></em>' literal value.
@@ -76,39 +105,6 @@
 	public static final int STREAM = 2;
 
 	/**
-	 * The '<em><b>Parallel</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PARALLEL
-	 * @generated
-	 * @ordered
-	 */
-	public static final ExpansionKind PARALLEL_LITERAL = new ExpansionKind(
-		PARALLEL, "parallel", "parallel"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Iterative</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ITERATIVE
-	 * @generated
-	 * @ordered
-	 */
-	public static final ExpansionKind ITERATIVE_LITERAL = new ExpansionKind(
-		ITERATIVE, "iterative", "iterative"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Stream</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #STREAM
-	 * @generated
-	 * @ordered
-	 */
-	public static final ExpansionKind STREAM_LITERAL = new ExpansionKind(
-		STREAM, "stream", "stream"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Expansion Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -123,8 +119,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<ExpansionKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Expansion Kind</b></em>' literal with the specified literal value.
@@ -177,13 +173,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private ExpansionKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //ExpansionKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionRegion.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionRegion.java
index c334541..63e8583 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionRegion.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExpansionRegion.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpansionRegion.java,v 1.7 2006/05/12 20:38:10 khussey Exp $
+ * $Id: ExpansionRegion.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -91,7 +91,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExpansionNode" opposite="regionAsInput" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getInputElements();
+	EList<ExpansionNode> getInputElements();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExpansionNode} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Input Element</b></em>' reference list.
@@ -133,7 +133,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExpansionNode" opposite="regionAsOutput" ordered="false"
 	 * @generated
 	 */
-	EList getOutputElements();
+	EList<ExpansionNode> getOutputElements();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExpansionNode} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Output Element</b></em>' reference list.
@@ -170,6 +170,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateExpansionNodes(DiagnosticChain diagnostics, Map context);
+	boolean validateExpansionNodes(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ExpansionRegion
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Expression.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Expression.java
index 5df975c..fed2279 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Expression.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Expression.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Expression.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Expression.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -106,7 +106,7 @@
 	 * @model type="org.eclipse.uml2.uml.ValueSpecification" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOperands();
+	EList<ValueSpecification> getOperands();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ValueSpecification}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Operand</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extend.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extend.java
index 564577c..49a189a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extend.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extend.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Extend.java,v 1.9 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Extend.java,v 1.10 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -134,7 +134,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExtensionPoint" required="true"
 	 * @generated
 	 */
-	EList getExtensionLocations();
+	EList<ExtensionPoint> getExtensionLocations();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExtensionPoint} with the specified '<em><b>Name</b></em>' from the '<em><b>Extension Location</b></em>' reference list.
@@ -198,6 +198,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateExtensionPoints(DiagnosticChain diagnostics, Map context);
+	boolean validateExtensionPoints(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Extend
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extension.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extension.java
index 85c7a13..26182fa 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extension.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Extension.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Extension.java,v 1.10 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Extension.java,v 1.11 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -81,7 +81,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNonOwnedEnd(DiagnosticChain diagnostics, Map context);
+	boolean validateNonOwnedEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -93,7 +94,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateIsBinary(DiagnosticChain diagnostics, Map context);
+	boolean validateIsBinary(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionEnd.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionEnd.java
index dc4bee3..648f60c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionEnd.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionEnd.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionEnd.java,v 1.2 2006/05/12 20:38:08 khussey Exp $
+ * $Id: ExtensionEnd.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,7 +44,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -56,6 +57,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAggregation(DiagnosticChain diagnostics, Map context);
+	boolean validateAggregation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ExtensionEnd
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionPoint.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionPoint.java
index c8e604c..69927bf 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionPoint.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ExtensionPoint.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionPoint.java,v 1.4 2006/05/12 20:38:03 khussey Exp $
+ * $Id: ExtensionPoint.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -76,6 +76,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustHaveName(DiagnosticChain diagnostics, Map context);
+	boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ExtensionPoint
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Feature.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Feature.java
index a35a2bd..7704cb4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Feature.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Feature.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Feature.java,v 1.8 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Feature.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -81,7 +81,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" opposite="feature" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getFeaturingClassifiers();
+	EList<Classifier> getFeaturingClassifiers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Featuring Classifier</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalNode.java
index 3f8594e..87b2ca3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalNode.java,v 1.1 2005/11/14 22:26:00 khussey Exp $
+ * $Id: FinalNode.java,v 1.2 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,6 +43,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoOutgoingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // FinalNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalState.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalState.java
index aeef768..aac3104 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalState.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FinalState.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalState.java,v 1.2 2006/02/23 17:20:47 khussey Exp $
+ * $Id: FinalState.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,7 +44,7 @@
 	 * @generated
 	 */
 	boolean validateNoOutgoingTransitions(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -56,7 +56,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoRegions(DiagnosticChain diagnostics, Map context);
+	boolean validateNoRegions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -69,7 +70,7 @@
 	 * @generated
 	 */
 	boolean validateCannotReferenceSubmachine(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -81,7 +82,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoEntryBehavior(DiagnosticChain diagnostics, Map context);
+	boolean validateNoEntryBehavior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -93,7 +95,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoExitBehavior(DiagnosticChain diagnostics, Map context);
+	boolean validateNoExitBehavior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -105,6 +108,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoStateBehavior(DiagnosticChain diagnostics, Map context);
+	boolean validateNoStateBehavior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // FinalState
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ForkNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ForkNode.java
index edb9c34..309ff5c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ForkNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ForkNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ForkNode.java,v 1.2 2006/05/12 20:38:03 khussey Exp $
+ * $Id: ForkNode.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,7 +43,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneIncomingEdge(DiagnosticChain diagnostics, Map context);
+	boolean validateOneIncomingEdge(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -55,6 +56,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ForkNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FunctionBehavior.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FunctionBehavior.java
index d5331fa..a3a7ecd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FunctionBehavior.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/FunctionBehavior.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FunctionBehavior.java,v 1.2 2006/04/05 13:49:57 khussey Exp $
+ * $Id: FunctionBehavior.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,7 +44,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneOutputParameter(DiagnosticChain diagnostics, Map context);
+	boolean validateOneOutputParameter(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -61,6 +62,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypesOfParameters(DiagnosticChain diagnostics, Map context);
+	boolean validateTypesOfParameters(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // FunctionBehavior
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Gate.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Gate.java
index 09b6427..2587535 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Gate.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Gate.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Gate.java,v 1.2 2006/05/12 20:38:03 khussey Exp $
+ * $Id: Gate.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,7 +43,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMessagesActualGate(DiagnosticChain diagnostics, Map context);
+	boolean validateMessagesActualGate(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -56,6 +57,6 @@
 	 * @generated
 	 */
 	boolean validateMessagesCombinedFragment(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // Gate
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Generalization.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Generalization.java
index 3afb957..06c7c90 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Generalization.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Generalization.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Generalization.java,v 1.9 2006/05/12 20:38:03 khussey Exp $
+ * $Id: Generalization.java,v 1.10 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -137,7 +137,7 @@
 	 * @model type="org.eclipse.uml2.uml.GeneralizationSet" opposite="generalization" ordered="false"
 	 * @generated
 	 */
-	EList getGeneralizationSets();
+	EList<GeneralizationSet> getGeneralizationSets();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.GeneralizationSet} with the specified '<em><b>Name</b></em>' from the '<em><b>Generalization Set</b></em>' reference list.
@@ -200,6 +200,6 @@
 	 * @generated
 	 */
 	boolean validateGeneralizationSameClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // Generalization
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/GeneralizationSet.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/GeneralizationSet.java
index cabd31d..a60c813 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/GeneralizationSet.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/GeneralizationSet.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralizationSet.java,v 1.9 2006/06/07 21:39:13 khussey Exp $
+ * $Id: GeneralizationSet.java,v 1.10 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -138,7 +138,7 @@
 	 * @model type="org.eclipse.uml2.uml.Generalization" opposite="generalizationSet" ordered="false"
 	 * @generated
 	 */
-	EList getGeneralizations();
+	EList<Generalization> getGeneralizations();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Generalization} with the specified '<em><b>General</b></em>' from the '<em><b>Generalization</b></em>' reference list.
@@ -162,7 +162,7 @@
 	 * @generated
 	 */
 	boolean validateGeneralizationSameClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -175,6 +175,6 @@
 	 * @generated
 	 */
 	boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // GeneralizationSet
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationFlow.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationFlow.java
index 228bb53..b5abc77 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationFlow.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationFlow.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationFlow.java,v 1.5 2006/05/12 20:38:10 khussey Exp $
+ * $Id: InformationFlow.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -62,7 +62,7 @@
 	 * @model type="org.eclipse.uml2.uml.Relationship" ordered="false"
 	 * @generated
 	 */
-	EList getRealizations();
+	EList<Relationship> getRealizations();
 
 	/**
 	 * Returns the value of the '<em><b>Conveyed</b></em>' reference list.
@@ -77,7 +77,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getConveyeds();
+	EList<Classifier> getConveyeds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Conveyed</b></em>' reference list.
@@ -116,7 +116,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getInformationSources();
+	EList<NamedElement> getInformationSources();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Information Source</b></em>' reference list.
@@ -156,7 +156,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getInformationTargets();
+	EList<NamedElement> getInformationTargets();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Information Target</b></em>' reference list.
@@ -196,7 +196,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" ordered="false"
 	 * @generated
 	 */
-	EList getRealizingActivityEdges();
+	EList<ActivityEdge> getRealizingActivityEdges();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Realizing Activity Edge</b></em>' reference list.
@@ -236,7 +236,7 @@
 	 * @model type="org.eclipse.uml2.uml.Connector" ordered="false"
 	 * @generated
 	 */
-	EList getRealizingConnectors();
+	EList<Connector> getRealizingConnectors();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Connector} with the specified '<em><b>Name</b></em>' from the '<em><b>Realizing Connector</b></em>' reference list.
@@ -274,7 +274,7 @@
 	 * @model type="org.eclipse.uml2.uml.Message" ordered="false"
 	 * @generated
 	 */
-	EList getRealizingMessages();
+	EList<Message> getRealizingMessages();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Message} with the specified '<em><b>Name</b></em>' from the '<em><b>Realizing Message</b></em>' reference list.
@@ -319,7 +319,7 @@
 	 * @generated
 	 */
 	boolean validateSourcesAndTargetsKind(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -331,7 +331,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustConform(DiagnosticChain diagnostics, Map context);
+	boolean validateMustConform(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -345,6 +346,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConveyClassifiers(DiagnosticChain diagnostics, Map context);
+	boolean validateConveyClassifiers(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InformationFlow
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationItem.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationItem.java
index d937aab..eba3fef 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationItem.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InformationItem.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationItem.java,v 1.5 2006/05/12 20:38:08 khussey Exp $
+ * $Id: InformationItem.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList getRepresenteds();
+	EList<Classifier> getRepresenteds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Represented</b></em>' reference list.
@@ -96,7 +96,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSourcesAndTargets(DiagnosticChain diagnostics, Map context);
+	boolean validateSourcesAndTargets(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -108,7 +109,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHasNo(DiagnosticChain diagnostics, Map context);
+	boolean validateHasNo(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -120,6 +122,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotInstantiable(DiagnosticChain diagnostics, Map context);
+	boolean validateNotInstantiable(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InformationItem
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InitialNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InitialNode.java
index 960443c..8b4afbe 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InitialNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InitialNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InitialNode.java,v 1.2 2006/05/12 20:38:06 khussey Exp $
+ * $Id: InitialNode.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,7 +43,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoIncomingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -55,6 +56,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateControlEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateControlEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InitialNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InputPin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InputPin.java
index 58d26c9..0ea932b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InputPin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InputPin.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InputPin.java,v 1.2 2006/05/16 15:07:25 khussey Exp $
+ * $Id: InputPin.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,6 +44,6 @@
 	 * @generated
 	 */
 	boolean validateOutgoingEdgesStructuredOnly(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // InputPin
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InstanceSpecification.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InstanceSpecification.java
index 078662c..17c50bb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InstanceSpecification.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InstanceSpecification.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InstanceSpecification.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: InstanceSpecification.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -59,7 +59,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList getClassifiers();
+	EList<Classifier> getClassifiers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Classifier</b></em>' reference list.
@@ -138,7 +138,7 @@
 	 * @model type="org.eclipse.uml2.uml.Slot" opposite="owningInstance" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getSlots();
+	EList<Slot> getSlots();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Slot} and appends it to the '<em><b>Slot</b></em>' containment reference list.
@@ -160,7 +160,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDefiningFeature(DiagnosticChain diagnostics, Map context);
+	boolean validateDefiningFeature(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -172,7 +173,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateStructuralFeature(DiagnosticChain diagnostics, Map context);
+	boolean validateStructuralFeature(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -184,7 +186,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeploymentTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateDeploymentTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -196,6 +199,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeploymentArtifact(DiagnosticChain diagnostics, Map context);
+	boolean validateDeploymentArtifact(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InstanceSpecification
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interaction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interaction.java
index df09a42..a28f249 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interaction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interaction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Interaction.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Interaction.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.Lifeline" opposite="interaction" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getLifelines();
+	EList<Lifeline> getLifelines();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Lifeline}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Lifeline</b></em>' containment reference list.
@@ -110,7 +110,7 @@
 	 * @model type="org.eclipse.uml2.uml.InteractionFragment" opposite="enclosingInteraction" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getFragments();
+	EList<InteractionFragment> getFragments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InteractionFragment}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Fragment</b></em>' containment reference list.
@@ -163,7 +163,7 @@
 	 * @model type="org.eclipse.uml2.uml.Action" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getActions();
+	EList<Action> getActions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Action}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Action</b></em>' containment reference list.
@@ -217,7 +217,7 @@
 	 * @model type="org.eclipse.uml2.uml.Gate" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getFormalGates();
+	EList<Gate> getFormalGates();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Gate}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Formal Gate</b></em>' containment reference list.
@@ -269,7 +269,7 @@
 	 * @model type="org.eclipse.uml2.uml.Message" opposite="interaction" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getMessages();
+	EList<Message> getMessages();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Message}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Message</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionConstraint.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionConstraint.java
index 79a0e80..503d4ea 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionConstraint.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionConstraint.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionConstraint.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: InteractionConstraint.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -128,7 +128,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDynamicVariables(DiagnosticChain diagnostics, Map context);
+	boolean validateDynamicVariables(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -140,7 +141,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGlobalData(DiagnosticChain diagnostics, Map context);
+	boolean validateGlobalData(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -152,7 +154,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMinintMaxint(DiagnosticChain diagnostics, Map context);
+	boolean validateMinintMaxint(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -164,7 +167,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMinintNonNegative(DiagnosticChain diagnostics, Map context);
+	boolean validateMinintNonNegative(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -176,7 +180,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMaxintPositive(DiagnosticChain diagnostics, Map context);
+	boolean validateMaxintPositive(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -189,6 +194,6 @@
 	 * @generated
 	 */
 	boolean validateMaxintGreaterEqualMinint(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // InteractionConstraint
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionFragment.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionFragment.java
index ec54382..ca16cd7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionFragment.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionFragment.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionFragment.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: InteractionFragment.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.Lifeline" opposite="coveredBy" ordered="false"
 	 * @generated
 	 */
-	EList getCovereds();
+	EList<Lifeline> getCovereds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Lifeline} with the specified '<em><b>Name</b></em>' from the '<em><b>Covered</b></em>' reference list.
@@ -93,7 +93,7 @@
 	 * @model type="org.eclipse.uml2.uml.GeneralOrdering" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getGeneralOrderings();
+	EList<GeneralOrdering> getGeneralOrderings();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.GeneralOrdering}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>General Ordering</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperand.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperand.java
index 876a105..2e398ff 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperand.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperand.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionOperand.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: InteractionOperand.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -95,7 +95,7 @@
 	 * @model type="org.eclipse.uml2.uml.InteractionFragment" opposite="enclosingOperand" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getFragments();
+	EList<InteractionFragment> getFragments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InteractionFragment}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Fragment</b></em>' containment reference list.
@@ -145,7 +145,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGuardDirectlyPrior(DiagnosticChain diagnostics, Map context);
+	boolean validateGuardDirectlyPrior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -158,6 +159,6 @@
 	 * @generated
 	 */
 	boolean validateGuardContainReferences(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // InteractionOperand
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperatorKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperatorKind.java
index 649b6c7..b2a25eb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperatorKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionOperatorKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionOperatorKind.java,v 1.2 2006/05/12 20:38:05 khussey Exp $
+ * $Id: InteractionOperatorKind.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,127 @@
  * @model
  * @generated
  */
-public final class InteractionOperatorKind
-		extends AbstractEnumerator {
+public enum InteractionOperatorKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Seq</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SEQ
+	 * @generated
+	 * @ordered
+	 */
+	SEQ_LITERAL(0, "seq", "seq"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Alt</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ALT
+	 * @generated
+	 * @ordered
+	 */
+	ALT_LITERAL(1, "alt", "alt"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Opt</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OPT
+	 * @generated
+	 * @ordered
+	 */
+	OPT_LITERAL(2, "opt", "opt"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Break</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BREAK
+	 * @generated
+	 * @ordered
+	 */
+	BREAK_LITERAL(3, "break", "break"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Par</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PAR
+	 * @generated
+	 * @ordered
+	 */
+	PAR_LITERAL(4, "par", "par"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Strict</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STRICT
+	 * @generated
+	 * @ordered
+	 */
+	STRICT_LITERAL(5, "strict", "strict"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Loop</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LOOP
+	 * @generated
+	 * @ordered
+	 */
+	LOOP_LITERAL(6, "loop", "loop"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Critical</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CRITICAL
+	 * @generated
+	 * @ordered
+	 */
+	CRITICAL_LITERAL(7, "critical", "critical"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Neg</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NEG
+	 * @generated
+	 * @ordered
+	 */
+	NEG_LITERAL(8, "neg", "neg"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Assert</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSERT
+	 * @generated
+	 * @ordered
+	 */
+	ASSERT_LITERAL(9, "assert", "assert"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Ignore</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IGNORE
+	 * @generated
+	 * @ordered
+	 */
+	IGNORE_LITERAL(10, "ignore", "ignore"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Consider</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CONSIDER
+	 * @generated
+	 * @ordered
+	 */
+	CONSIDER_LITERAL(11, "consider", "consider"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Seq</b></em>' literal value.
@@ -202,138 +321,6 @@
 	public static final int CONSIDER = 11;
 
 	/**
-	 * The '<em><b>Seq</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SEQ
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind SEQ_LITERAL = new InteractionOperatorKind(
-		SEQ, "seq", "seq"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Alt</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ALT
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind ALT_LITERAL = new InteractionOperatorKind(
-		ALT, "alt", "alt"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Opt</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #OPT
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind OPT_LITERAL = new InteractionOperatorKind(
-		OPT, "opt", "opt"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Break</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #BREAK
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind BREAK_LITERAL = new InteractionOperatorKind(
-		BREAK, "break", "break"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Par</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PAR
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind PAR_LITERAL = new InteractionOperatorKind(
-		PAR, "par", "par"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Strict</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #STRICT
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind STRICT_LITERAL = new InteractionOperatorKind(
-		STRICT, "strict", "strict"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Loop</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOOP
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind LOOP_LITERAL = new InteractionOperatorKind(
-		LOOP, "loop", "loop"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Critical</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CRITICAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind CRITICAL_LITERAL = new InteractionOperatorKind(
-		CRITICAL, "critical", "critical"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Neg</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #NEG
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind NEG_LITERAL = new InteractionOperatorKind(
-		NEG, "neg", "neg"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Assert</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ASSERT
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind ASSERT_LITERAL = new InteractionOperatorKind(
-		ASSERT, "assert", "assert"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Ignore</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #IGNORE
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind IGNORE_LITERAL = new InteractionOperatorKind(
-		IGNORE, "ignore", "ignore"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Consider</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CONSIDER
-	 * @generated
-	 * @ordered
-	 */
-	public static final InteractionOperatorKind CONSIDER_LITERAL = new InteractionOperatorKind(
-		CONSIDER, "consider", "consider"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Interaction Operator Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -350,8 +337,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<InteractionOperatorKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Interaction Operator Kind</b></em>' literal with the specified literal value.
@@ -422,13 +409,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private InteractionOperatorKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //InteractionOperatorKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionUse.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionUse.java
index 25a3e13..b0a99ca 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionUse.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InteractionUse.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionUse.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: InteractionUse.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -83,7 +83,7 @@
 	 * @model type="org.eclipse.uml2.uml.Gate" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getActualGates();
+	EList<Gate> getActualGates();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Gate}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Actual Gate</b></em>' containment reference list.
@@ -133,7 +133,7 @@
 	 * @model type="org.eclipse.uml2.uml.Action" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getArguments();
+	EList<Action> getArguments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Action}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Argument</b></em>' containment reference list.
@@ -183,7 +183,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGatesMatch(DiagnosticChain diagnostics, Map context);
+	boolean validateGatesMatch(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -195,7 +196,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAllLifelines(DiagnosticChain diagnostics, Map context);
+	boolean validateAllLifelines(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -208,7 +210,7 @@
 	 * @generated
 	 */
 	boolean validateArgumentsCorrespondToParameters(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -221,6 +223,6 @@
 	 * @generated
 	 */
 	boolean validateArgumentsAreConstants(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // InteractionUse
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interface.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interface.java
index 84b5974..d434a99 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interface.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Interface.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Interface.java,v 1.10 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Interface.java,v 1.11 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -63,7 +63,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedAttributes();
+	EList<Property> getOwnedAttributes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Attribute</b></em>' containment reference list.
@@ -131,7 +131,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getNestedClassifiers();
+	EList<Classifier> getNestedClassifiers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Classifier}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Classifier</b></em>' containment reference list.
@@ -184,7 +184,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedInterfaces();
+	EList<Interface> getRedefinedInterfaces();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Interface} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Interface</b></em>' reference list.
@@ -222,7 +222,7 @@
 	 * @model type="org.eclipse.uml2.uml.Reception" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedReceptions();
+	EList<Reception> getOwnedReceptions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Reception}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -235,8 +235,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception createOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Reception createOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Reception} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -249,8 +249,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Reception getOwnedReception(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Reception} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Reception</b></em>' containment reference list.
@@ -265,8 +265,8 @@
 	 * @see #getOwnedReceptions()
 	 * @generated
 	 */
-	Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Reception getOwnedReception(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -320,7 +320,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" opposite="interface" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedOperations();
+	EList<Operation> getOwnedOperations();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Operation}, with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>', and appends it to the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -333,8 +333,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation createOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -347,8 +347,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Owned Operation</b></em>' containment reference list.
@@ -363,8 +363,8 @@
 	 * @see #getOwnedOperations()
 	 * @generated
 	 */
-	Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
+	Operation getOwnedOperation(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase,
 			boolean createOnDemand);
 
 	/**
@@ -377,7 +377,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateVisibility(DiagnosticChain diagnostics, Map context);
+	boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -388,8 +389,8 @@
 	 * @model required="true" ordered="false" nameDataType="org.eclipse.uml2.uml.String" nameOrdered="false" parameterNamesType="java.lang.String" parameterNamesDataType="org.eclipse.uml2.uml.String" parameterNamesMany="true" parameterNamesOrdered="false" parameterTypesType="org.eclipse.uml2.uml.Type" parameterTypesMany="true" parameterTypesOrdered="false" returnTypeOrdered="false"
 	 * @generated
 	 */
-	Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType);
+	Operation createOwnedOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InterruptibleActivityRegion.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InterruptibleActivityRegion.java
index ad6cb8f..15aefbb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InterruptibleActivityRegion.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InterruptibleActivityRegion.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterruptibleActivityRegion.java,v 1.5 2006/05/12 20:38:06 khussey Exp $
+ * $Id: InterruptibleActivityRegion.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -59,7 +59,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" opposite="inInterruptibleRegion" ordered="false"
 	 * @generated
 	 */
-	EList getNodes();
+	EList<ActivityNode> getNodes();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Node</b></em>' reference list.
@@ -100,7 +100,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="interrupts" ordered="false"
 	 * @generated
 	 */
-	EList getInterruptingEdges();
+	EList<ActivityEdge> getInterruptingEdges();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ActivityEdge} with the specified '<em><b>Name</b></em>' from the '<em><b>Interrupting Edge</b></em>' reference list.
@@ -138,6 +138,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInterruptingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateInterruptingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InterruptibleActivityRegion
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InvocationAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InvocationAction.java
index a478cea..c2057dc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InvocationAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/InvocationAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InvocationAction.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: InvocationAction.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getArguments();
+	EList<InputPin> getArguments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Argument</b></em>' containment reference list.
@@ -148,6 +148,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOnPortReceiver(DiagnosticChain diagnostics, Map context);
+	boolean validateOnPortReceiver(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // InvocationAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/JoinNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/JoinNode.java
index 6e6bc3f..f108dd5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/JoinNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/JoinNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: JoinNode.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: JoinNode.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -117,7 +117,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneOutgoingEdge(DiagnosticChain diagnostics, Map context);
+	boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -132,6 +133,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateIncomingObjectFlow(DiagnosticChain diagnostics, Map context);
+	boolean validateIncomingObjectFlow(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // JoinNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Lifeline.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Lifeline.java
index c0b26dd..1c61471 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Lifeline.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Lifeline.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Lifeline.java,v 1.11 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Lifeline.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -177,7 +177,7 @@
 	 * @model type="org.eclipse.uml2.uml.InteractionFragment" opposite="covered" ordered="false"
 	 * @generated
 	 */
-	EList getCoveredBys();
+	EList<InteractionFragment> getCoveredBys();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.InteractionFragment} with the specified '<em><b>Name</b></em>' from the '<em><b>Covered By</b></em>' reference list.
@@ -215,7 +215,7 @@
 	 * @generated
 	 */
 	boolean validateInteractionUsesShareLifeline(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -229,7 +229,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSelectorSpecified(DiagnosticChain diagnostics, Map context);
+	boolean validateSelectorSpecified(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -243,6 +244,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameClassifier(DiagnosticChain diagnostics, Map context);
+	boolean validateSameClassifier(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Lifeline
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkAction.java
index bd6c921..cc42538 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkAction.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: LinkAction.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -57,7 +57,7 @@
 	 * @model type="org.eclipse.uml2.uml.LinkEndData" containment="true" resolveProxies="true" lower="2" ordered="false"
 	 * @generated
 	 */
-	EList getEndData();
+	EList<LinkEndData> getEndData();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.LinkEndData} and appends it to the '<em><b>End Data</b></em>' containment reference list.
@@ -93,7 +93,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" containment="true" resolveProxies="true" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getInputValues();
+	EList<InputPin> getInputValues();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Input Value</b></em>' containment reference list.
@@ -158,7 +158,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameAssociation(DiagnosticChain diagnostics, Map context);
+	boolean validateSameAssociation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -170,7 +171,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotStatic(DiagnosticChain diagnostics, Map context);
+	boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -187,7 +189,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSamePins(DiagnosticChain diagnostics, Map context);
+	boolean validateSamePins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndCreationData.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndCreationData.java
index ec172fc..a6cf937 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndCreationData.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndCreationData.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndCreationData.java,v 1.5 2006/05/12 20:38:04 khussey Exp $
+ * $Id: LinkEndCreationData.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -101,7 +101,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCreateLinkAction(DiagnosticChain diagnostics, Map context);
+	boolean validateCreateLinkAction(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -121,6 +122,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSingleInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateSingleInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // LinkEndCreationData
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndData.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndData.java
index 7f94904..aeb6eca 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndData.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndData.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndData.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: LinkEndData.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -106,7 +106,7 @@
 	 * @model type="org.eclipse.uml2.uml.QualifierValue" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getQualifiers();
+	EList<QualifierValue> getQualifiers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.QualifierValue} and appends it to the '<em><b>Qualifier</b></em>' containment reference list.
@@ -129,7 +129,7 @@
 	 * @generated
 	 */
 	boolean validatePropertyIsAssociationEnd(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -141,7 +141,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -153,7 +154,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -165,7 +167,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateQualifiers(DiagnosticChain diagnostics, Map context);
+	boolean validateQualifiers(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -177,6 +180,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEndObjectInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateEndObjectInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // LinkEndData
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndDestructionData.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndDestructionData.java
index fdf44a2..f3bc78b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndDestructionData.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LinkEndDestructionData.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndDestructionData.java,v 1.5 2006/05/12 20:38:08 khussey Exp $
+ * $Id: LinkEndDestructionData.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -101,7 +101,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDestroyLinkAction(DiagnosticChain diagnostics, Map context);
+	boolean validateDestroyLinkAction(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -114,6 +115,6 @@
 	 * @generated
 	 */
 	boolean validateUnlimitedNaturalAndMultiplicity(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 } // LinkEndDestructionData
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LoopNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LoopNode.java
index 433302a..a077d92 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LoopNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/LoopNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LoopNode.java,v 1.11 2006/05/26 16:34:02 khussey Exp $
+ * $Id: LoopNode.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -92,7 +92,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" ordered="false"
 	 * @generated
 	 */
-	EList getBodyParts();
+	EList<ExecutableNode> getBodyParts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExecutableNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Body Part</b></em>' reference list.
@@ -131,7 +131,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" ordered="false"
 	 * @generated
 	 */
-	EList getSetupParts();
+	EList<ExecutableNode> getSetupParts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExecutableNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Setup Part</b></em>' reference list.
@@ -195,7 +195,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" ordered="false"
 	 * @generated
 	 */
-	EList getTests();
+	EList<ExecutableNode> getTests();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ExecutableNode} with the specified '<em><b>Name</b></em>' from the '<em><b>Test</b></em>' reference list.
@@ -234,7 +234,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getResults();
+	EList<OutputPin> getResults();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Result</b></em>' containment reference list.
@@ -288,7 +288,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin"
 	 * @generated
 	 */
-	EList getLoopVariables();
+	EList<OutputPin> getLoopVariables();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.OutputPin} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Loop Variable</b></em>' reference list.
@@ -328,7 +328,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin"
 	 * @generated
 	 */
-	EList getBodyOutputs();
+	EList<OutputPin> getBodyOutputs();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.OutputPin} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Body Output</b></em>' reference list.
@@ -368,7 +368,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getLoopVariableInputs();
+	EList<InputPin> getLoopVariableInputs();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Loop Variable Input</b></em>' containment reference list.
@@ -433,7 +433,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInputEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateInputEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -445,7 +446,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBodyOutputPins(DiagnosticChain diagnostics, Map context);
+	boolean validateBodyOutputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -457,6 +459,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateResultNoIncoming(DiagnosticChain diagnostics, Map context);
+	boolean validateResultNoIncoming(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // LoopNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MergeNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MergeNode.java
index 9e30a9f..1aaae51 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MergeNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MergeNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MergeNode.java,v 1.2 2006/05/12 20:38:04 khussey Exp $
+ * $Id: MergeNode.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,7 +43,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneOutgoingEdge(DiagnosticChain diagnostics, Map context);
+	boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -55,6 +56,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // MergeNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Message.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Message.java
index d4dad83..72fcc67 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Message.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Message.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Message.java,v 1.13 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Message.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -211,7 +211,7 @@
 	 * @model type="org.eclipse.uml2.uml.ValueSpecification" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getArguments();
+	EList<ValueSpecification> getArguments();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ValueSpecification}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Argument</b></em>' containment reference list.
@@ -279,7 +279,7 @@
 	 * @generated
 	 */
 	boolean validateSendingReceivingMessageEvent(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -291,7 +291,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSignatureReferTo(DiagnosticChain diagnostics, Map context);
+	boolean validateSignatureReferTo(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -304,7 +305,7 @@
 	 * @generated
 	 */
 	boolean validateSignatureIsOperation(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -316,7 +317,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSignatureIsSignal(DiagnosticChain diagnostics, Map context);
+	boolean validateSignatureIsSignal(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -334,7 +336,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateArguments(DiagnosticChain diagnostics, Map context);
+	boolean validateArguments(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -347,7 +350,7 @@
 	 * @generated
 	 */
 	boolean validateCannotCrossBoundaries(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -360,6 +363,6 @@
 	 * @generated
 	 */
 	boolean validateOccurrenceSpecifications(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // Message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageKind.java
index dfc8693..4c887e4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageKind.java,v 1.4 2006/05/12 20:38:04 khussey Exp $
+ * $Id: MessageKind.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,47 @@
  * @model
  * @generated
  */
-public final class MessageKind
-		extends AbstractEnumerator {
+public enum MessageKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Complete</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #COMPLETE
+	 * @generated
+	 * @ordered
+	 */
+	COMPLETE_LITERAL(0, "complete", "complete"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Lost</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LOST
+	 * @generated
+	 * @ordered
+	 */
+	LOST_LITERAL(1, "lost", "lost"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Found</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FOUND
+	 * @generated
+	 * @ordered
+	 */
+	FOUND_LITERAL(2, "found", "found"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Unknown</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UNKNOWN
+	 * @generated
+	 * @ordered
+	 */
+	UNKNOWN_LITERAL(3, "unknown", "unknown"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Complete</b></em>' literal value.
@@ -90,50 +129,6 @@
 	public static final int UNKNOWN = 3;
 
 	/**
-	 * The '<em><b>Complete</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #COMPLETE
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageKind COMPLETE_LITERAL = new MessageKind(
-		COMPLETE, "complete", "complete"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Lost</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOST
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageKind LOST_LITERAL = new MessageKind(LOST,
-		"lost", "lost"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Found</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FOUND
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageKind FOUND_LITERAL = new MessageKind(FOUND,
-		"found", "found"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Unknown</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageKind UNKNOWN_LITERAL = new MessageKind(UNKNOWN,
-		"unknown", "unknown"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Message Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -148,8 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<MessageKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Message Kind</b></em>' literal with the specified literal value.
@@ -204,13 +199,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private MessageKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //MessageKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageSort.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageSort.java
index a8a3b9c..8f819fc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageSort.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MessageSort.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageSort.java,v 1.5 2006/05/12 20:38:04 khussey Exp $
+ * $Id: MessageSort.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,67 @@
  * @model
  * @generated
  */
-public final class MessageSort
-		extends AbstractEnumerator {
+public enum MessageSort
+		implements Enumerator {
+	/**
+	 * The '<em><b>Synch Call</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SYNCH_CALL
+	 * @generated
+	 * @ordered
+	 */
+	SYNCH_CALL_LITERAL(0, "synchCall", "synchCall"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Asynch Call</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASYNCH_CALL
+	 * @generated
+	 * @ordered
+	 */
+	ASYNCH_CALL_LITERAL(1, "asynchCall", "asynchCall"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Asynch Signal</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASYNCH_SIGNAL
+	 * @generated
+	 * @ordered
+	 */
+	ASYNCH_SIGNAL_LITERAL(2, "asynchSignal", "asynchSignal"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Create Message</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CREATE_MESSAGE
+	 * @generated
+	 * @ordered
+	 */
+	CREATE_MESSAGE_LITERAL(3, "createMessage", "createMessage"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Delete Message</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DELETE_MESSAGE
+	 * @generated
+	 * @ordered
+	 */
+	DELETE_MESSAGE_LITERAL(4, "deleteMessage", "deleteMessage"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Reply</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #REPLY
+	 * @generated
+	 * @ordered
+	 */
+	REPLY_LITERAL(5, "reply", "reply"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Synch Call</b></em>' literal value.
@@ -120,72 +179,6 @@
 	public static final int REPLY = 5;
 
 	/**
-	 * The '<em><b>Synch Call</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SYNCH_CALL
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort SYNCH_CALL_LITERAL = new MessageSort(
-		SYNCH_CALL, "synchCall", "synchCall"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Asynch Call</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ASYNCH_CALL
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort ASYNCH_CALL_LITERAL = new MessageSort(
-		ASYNCH_CALL, "asynchCall", "asynchCall"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Asynch Signal</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ASYNCH_SIGNAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort ASYNCH_SIGNAL_LITERAL = new MessageSort(
-		ASYNCH_SIGNAL, "asynchSignal", "asynchSignal"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Create Message</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CREATE_MESSAGE
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort CREATE_MESSAGE_LITERAL = new MessageSort(
-		CREATE_MESSAGE, "createMessage", "createMessage"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Delete Message</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #DELETE_MESSAGE
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort DELETE_MESSAGE_LITERAL = new MessageSort(
-		DELETE_MESSAGE, "deleteMessage", "deleteMessage"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Reply</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #REPLY
-	 * @generated
-	 * @ordered
-	 */
-	public static final MessageSort REPLY_LITERAL = new MessageSort(REPLY,
-		"reply", "reply"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Message Sort</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -201,8 +194,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<MessageSort> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Message Sort</b></em>' literal with the specified literal value.
@@ -261,13 +254,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private MessageSort(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //MessageSort
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MultiplicityElement.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MultiplicityElement.java
index d27ab34..3076e90 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MultiplicityElement.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/MultiplicityElement.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MultiplicityElement.java,v 1.15 2006/06/07 21:39:13 khussey Exp $
+ * $Id: MultiplicityElement.java,v 1.16 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -236,7 +236,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateUpperGt0(DiagnosticChain diagnostics, Map context);
+	boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -248,7 +249,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateLowerGe0(DiagnosticChain diagnostics, Map context);
+	boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -260,7 +262,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context);
+	boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -273,7 +276,7 @@
 	 * @generated
 	 */
 	boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -286,7 +289,7 @@
 	 * @generated
 	 */
 	boolean validateValueSpecificationConstant(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/NamedElement.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/NamedElement.java
index e6e9c4c..358bd5d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/NamedElement.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/NamedElement.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NamedElement.java,v 1.15 2006/05/26 16:34:03 khussey Exp $
+ * $Id: NamedElement.java,v 1.16 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -185,7 +185,7 @@
 	 * @model type="org.eclipse.uml2.uml.Dependency" opposite="client" ordered="false"
 	 * @generated
 	 */
-	EList getClientDependencies();
+	EList<Dependency> getClientDependencies();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Dependency} with the specified '<em><b>Name</b></em>' from the '<em><b>Client Dependency</b></em>' reference list.
@@ -276,7 +276,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHasNoQualifiedName(DiagnosticChain diagnostics, Map context);
+	boolean validateHasNoQualifiedName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -289,7 +290,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHasQualifiedName(DiagnosticChain diagnostics, Map context);
+	boolean validateHasQualifiedName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -302,7 +304,7 @@
 	 * @generated
 	 */
 	boolean validateVisibilityNeedsOwnership(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -350,7 +352,7 @@
 	 * @model type="org.eclipse.uml2.uml.Namespace"
 	 * @generated
 	 */
-	EList allNamespaces();
+	EList<Namespace> allNamespaces();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -389,7 +391,7 @@
 	 * @model type="org.eclipse.uml2.uml.Package" ordered="false"
 	 * @generated
 	 */
-	EList allOwningPackages();
+	EList<org.eclipse.uml2.uml.Package> allOwningPackages();
 
 	String SEPARATOR = "::"; //$NON-NLS-1$
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Namespace.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Namespace.java
index 03f6b1a..b3246fd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Namespace.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Namespace.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Namespace.java,v 1.11 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Namespace.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -63,7 +63,7 @@
 	 * @model type="org.eclipse.uml2.uml.ElementImport" opposite="importingNamespace" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getElementImports();
+	EList<ElementImport> getElementImports();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ElementImport}, with the specified '<em><b>Imported Element</b></em>', and appends it to the '<em><b>Element Import</b></em>' containment reference list.
@@ -115,7 +115,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageImport" opposite="importingNamespace" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPackageImports();
+	EList<PackageImport> getPackageImports();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.PackageImport}, with the specified '<em><b>Imported Package</b></em>', and appends it to the '<em><b>Package Import</b></em>' containment reference list.
@@ -168,7 +168,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" opposite="context" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedRules();
+	EList<Constraint> getOwnedRules();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Rule</b></em>' containment reference list.
@@ -232,7 +232,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getMembers();
+	EList<NamedElement> getMembers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Member</b></em>' reference list.
@@ -271,7 +271,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getImportedMembers();
+	EList<PackageableElement> getImportedMembers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.PackageableElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Imported Member</b></em>' reference list.
@@ -313,7 +313,7 @@
 	 * @model type="org.eclipse.uml2.uml.NamedElement" opposite="namespace" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedMembers();
+	EList<NamedElement> getOwnedMembers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.NamedElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Owned Member</b></em>' reference list.
@@ -350,7 +350,7 @@
 	 * @generated
 	 */
 	boolean validateMembersDistinguishable(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -385,7 +385,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.PackageableElement" ordered="false"
 	 * @generated
 	 */
-	EList getImportedElements();
+	EList<PackageableElement> getImportedElements();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -396,7 +396,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Package" ordered="false"
 	 * @generated
 	 */
-	EList getImportedPackages();
+	EList<org.eclipse.uml2.uml.Package> getImportedPackages();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -416,7 +416,7 @@
 	 * @model type="java.lang.String" dataType="org.eclipse.uml2.uml.String" ordered="false" elementRequired="true" elementOrdered="false"
 	 * @generated
 	 */
-	EList getNamesOfMember(NamedElement element);
+	EList<String> getNamesOfMember(NamedElement element);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -443,7 +443,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" ordered="false" impsType="org.eclipse.uml2.uml.PackageableElement" impsMany="true" impsOrdered="false"
 	 * @generated
 	 */
-	EList importMembers(EList imps);
+	EList<PackageableElement> importMembers(EList<PackageableElement> imps);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -455,6 +455,6 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" ordered="false" impsType="org.eclipse.uml2.uml.PackageableElement" impsMany="true" impsOrdered="false"
 	 * @generated
 	 */
-	EList excludeCollisions(EList imps);
+	EList<PackageableElement> excludeCollisions(EList<PackageableElement> imps);
 
 } // Namespace
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Node.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Node.java
index 89f41d1..0951bf0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Node.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Node.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Node.java,v 1.6 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Node.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -57,7 +57,7 @@
 	 * @model type="org.eclipse.uml2.uml.Node" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getNestedNodes();
+	EList<Node> getNestedNodes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Node}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Node</b></em>' containment reference list.
@@ -118,6 +118,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInternalStructure(DiagnosticChain diagnostics, Map context);
+	boolean validateInternalStructure(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Node
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectFlow.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectFlow.java
index 67243ad..f3935f5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectFlow.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectFlow.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectFlow.java,v 1.5 2006/05/12 20:38:04 khussey Exp $
+ * $Id: ObjectFlow.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -155,7 +155,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoActions(DiagnosticChain diagnostics, Map context);
+	boolean validateNoActions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -168,7 +169,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCompatibleTypes(DiagnosticChain diagnostics, Map context);
+	boolean validateCompatibleTypes(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -180,7 +182,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameUpperBounds(DiagnosticChain diagnostics, Map context);
+	boolean validateSameUpperBounds(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -192,7 +195,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -205,7 +209,7 @@
 	 * @generated
 	 */
 	boolean validateTransformationBehaviour(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -217,7 +221,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSelectionBehaviour(DiagnosticChain diagnostics, Map context);
+	boolean validateSelectionBehaviour(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -230,7 +235,7 @@
 	 * @generated
 	 */
 	boolean validateInputAndOutputParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -243,6 +248,6 @@
 	 * @generated
 	 */
 	boolean validateIsMulticastOrIsMultireceive(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ObjectFlow
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNode.java
index ad35495..146c04c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectNode.java,v 1.9 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ObjectNode.java,v 1.10 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -154,7 +154,7 @@
 	 * @model type="org.eclipse.uml2.uml.State" ordered="false"
 	 * @generated
 	 */
-	EList getInStates();
+	EList<State> getInStates();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.State} with the specified '<em><b>Name</b></em>' from the '<em><b>In State</b></em>' reference list.
@@ -215,7 +215,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateObjectFlowEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateObjectFlowEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -227,7 +228,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotUnique(DiagnosticChain diagnostics, Map context);
+	boolean validateNotUnique(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -239,7 +241,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSelectionBehavior(DiagnosticChain diagnostics, Map context);
+	boolean validateSelectionBehavior(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -252,6 +255,6 @@
 	 * @generated
 	 */
 	boolean validateInputOutputParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ObjectNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNodeOrderingKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNodeOrderingKind.java
index ccd4c8c..cdf06f1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNodeOrderingKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ObjectNodeOrderingKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectNodeOrderingKind.java,v 1.2 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ObjectNodeOrderingKind.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,47 @@
  * @model
  * @generated
  */
-public final class ObjectNodeOrderingKind
-		extends AbstractEnumerator {
+public enum ObjectNodeOrderingKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Unordered</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UNORDERED
+	 * @generated
+	 * @ordered
+	 */
+	UNORDERED_LITERAL(0, "unordered", "unordered"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Ordered</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ORDERED
+	 * @generated
+	 * @ordered
+	 */
+	ORDERED_LITERAL(1, "ordered", "ordered"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>LIFO</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LIFO
+	 * @generated
+	 * @ordered
+	 */
+	LIFO_LITERAL(2, "LIFO", "LIFO"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>FIFO</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FIFO
+	 * @generated
+	 * @ordered
+	 */
+	FIFO_LITERAL(3, "FIFO", "FIFO"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Unordered</b></em>' literal value.
@@ -90,50 +129,6 @@
 	public static final int FIFO = 3;
 
 	/**
-	 * The '<em><b>Unordered</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UNORDERED
-	 * @generated
-	 * @ordered
-	 */
-	public static final ObjectNodeOrderingKind UNORDERED_LITERAL = new ObjectNodeOrderingKind(
-		UNORDERED, "unordered", "unordered"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Ordered</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ORDERED
-	 * @generated
-	 * @ordered
-	 */
-	public static final ObjectNodeOrderingKind ORDERED_LITERAL = new ObjectNodeOrderingKind(
-		ORDERED, "ordered", "ordered"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>LIFO</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LIFO
-	 * @generated
-	 * @ordered
-	 */
-	public static final ObjectNodeOrderingKind LIFO_LITERAL = new ObjectNodeOrderingKind(
-		LIFO, "LIFO", "LIFO"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>FIFO</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FIFO
-	 * @generated
-	 * @ordered
-	 */
-	public static final ObjectNodeOrderingKind FIFO_LITERAL = new ObjectNodeOrderingKind(
-		FIFO, "FIFO", "FIFO"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Object Node Ordering Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -148,8 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<ObjectNodeOrderingKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Object Node Ordering Kind</b></em>' literal with the specified literal value.
@@ -204,13 +199,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private ObjectNodeOrderingKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //ObjectNodeOrderingKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OccurrenceSpecification.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OccurrenceSpecification.java
index bc8f1d1..d8e9058 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OccurrenceSpecification.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OccurrenceSpecification.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OccurrenceSpecification.java,v 1.6 2006/05/12 20:38:05 khussey Exp $
+ * $Id: OccurrenceSpecification.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.GeneralOrdering" opposite="after" ordered="false"
 	 * @generated
 	 */
-	EList getToBefores();
+	EList<GeneralOrdering> getToBefores();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.GeneralOrdering} with the specified '<em><b>Name</b></em>' from the '<em><b>To Before</b></em>' reference list.
@@ -121,7 +121,7 @@
 	 * @model type="org.eclipse.uml2.uml.GeneralOrdering" opposite="before" ordered="false"
 	 * @generated
 	 */
-	EList getToAfters();
+	EList<GeneralOrdering> getToAfters();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.GeneralOrdering} with the specified '<em><b>Name</b></em>' from the '<em><b>To After</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueAction.java
index 6a4c096..cbf3384 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueAction.java,v 1.8 2006/10/10 20:41:28 khussey Exp $
+ * $Id: OpaqueAction.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 *        extendedMetaData="kind='element'"
 	 * @generated
 	 */
-	EList getBodies();
+	EList<String> getBodies();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueAction#getBodies <em>Body</em>}' attribute list.
@@ -96,7 +96,7 @@
 	 * @model type="java.lang.String" unsettable="true" dataType="org.eclipse.uml2.uml.String"
 	 * @generated
 	 */
-	EList getLanguages();
+	EList<String> getLanguages();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueAction#getLanguages <em>Language</em>}' attribute list.
@@ -132,7 +132,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getInputValues();
+	EList<InputPin> getInputValues();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Input Value</b></em>' containment reference list.
@@ -215,7 +215,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOutputValues();
+	EList<OutputPin> getOutputValues();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Output Value</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueBehavior.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueBehavior.java
index 3c89ee5..5747f0c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueBehavior.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueBehavior.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueBehavior.java,v 1.5 2006/10/10 20:41:28 khussey Exp $
+ * $Id: OpaqueBehavior.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -54,7 +54,7 @@
 	 *        extendedMetaData="kind='element'"
 	 * @generated
 	 */
-	EList getBodies();
+	EList<String> getBodies();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueBehavior#getBodies <em>Body</em>}' attribute list.
@@ -92,7 +92,7 @@
 	 * @model type="java.lang.String" unsettable="true" dataType="org.eclipse.uml2.uml.String"
 	 * @generated
 	 */
-	EList getLanguages();
+	EList<String> getLanguages();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueBehavior#getLanguages <em>Language</em>}' attribute list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueExpression.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueExpression.java
index 7956131..5c8ccbd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueExpression.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OpaqueExpression.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueExpression.java,v 1.11 2006/10/10 20:41:28 khussey Exp $
+ * $Id: OpaqueExpression.java,v 1.12 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -61,7 +61,7 @@
 	 *        extendedMetaData="kind='element'"
 	 * @generated
 	 */
-	EList getBodies();
+	EList<String> getBodies();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueExpression#getBodies <em>Body</em>}' attribute list.
@@ -99,7 +99,7 @@
 	 * @model type="java.lang.String" unsettable="true" dataType="org.eclipse.uml2.uml.String"
 	 * @generated
 	 */
-	EList getLanguages();
+	EList<String> getLanguages();
 
 	/**
 	 * Unsets the value of the '{@link org.eclipse.uml2.uml.OpaqueExpression#getLanguages <em>Language</em>}' attribute list.
@@ -171,7 +171,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateLanguageBodySize(DiagnosticChain diagnostics, Map context);
+	boolean validateLanguageBodySize(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -185,7 +186,7 @@
 	 * @generated
 	 */
 	boolean validateOnlyReturnResultParameters(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -199,7 +200,7 @@
 	 * @generated
 	 */
 	boolean validateOneReturnResultParameter(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Operation.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Operation.java
index f0bd3e5..4e1a81b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Operation.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Operation.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Operation.java,v 1.14 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Operation.java,v 1.15 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -231,7 +231,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" ordered="false"
 	 * @generated
 	 */
-	EList getPreconditions();
+	EList<Constraint> getPreconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Precondition</b></em>' reference list.
@@ -295,7 +295,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" ordered="false"
 	 * @generated
 	 */
-	EList getPostconditions();
+	EList<Constraint> getPostconditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Postcondition</b></em>' reference list.
@@ -359,7 +359,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedOperations();
+	EList<Operation> getRedefinedOperations();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Redefined Operation</b></em>' reference list.
@@ -372,8 +372,8 @@
 	 * @see #getRedefinedOperations()
 	 * @generated
 	 */
-	Operation getRedefinedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getRedefinedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Redefined Operation</b></em>' reference list.
@@ -387,8 +387,9 @@
 	 * @see #getRedefinedOperations()
 	 * @generated
 	 */
-	Operation getRedefinedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase);
+	Operation getRedefinedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase);
 
 	/**
 	 * Returns the value of the '<em><b>Datatype</b></em>' container reference.
@@ -528,7 +529,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAtMostOneReturn(DiagnosticChain diagnostics, Map context);
+	boolean validateAtMostOneReturn(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -540,7 +542,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOnlyBodyForQuery(DiagnosticChain diagnostics, Map context);
+	boolean validateOnlyBodyForQuery(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -587,6 +590,6 @@
 	 * @model type="org.eclipse.uml2.uml.Parameter" ordered="false"
 	 * @generated
 	 */
-	EList returnResult();
+	EList<Parameter> returnResult();
 
 } // Operation
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OutputPin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OutputPin.java
index 1ddc125..32c4e2e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OutputPin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/OutputPin.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OutputPin.java,v 1.2 2006/05/16 15:07:26 khussey Exp $
+ * $Id: OutputPin.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,6 +44,6 @@
 	 * @generated
 	 */
 	boolean validateIncomingEdgesStructuredOnly(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // OutputPin
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Package.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Package.java
index 03429b8..ec97e5b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Package.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Package.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Package.java,v 1.17 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Package.java,v 1.18 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -19,6 +19,7 @@
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 
 /**
  * <!-- begin-user-doc -->
@@ -65,7 +66,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageMerge" opposite="receivingPackage" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPackageMerges();
+	EList<PackageMerge> getPackageMerges();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.PackageMerge}, with the specified '<em><b>Merged Package</b></em>', and appends it to the '<em><b>Package Merge</b></em>' containment reference list.
@@ -114,7 +115,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getPackagedElements();
+	EList<PackageableElement> getPackagedElements();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.PackageableElement}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Packaged Element</b></em>' containment reference list.
@@ -169,7 +170,7 @@
 	 * @model type="org.eclipse.uml2.uml.Type" opposite="package" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedTypes();
+	EList<Type> getOwnedTypes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Type}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Type</b></em>' reference list.
@@ -224,7 +225,7 @@
 	 * @model type="org.eclipse.uml2.uml.Package" opposite="nestingPackage" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getNestedPackages();
+	EList<Package> getNestedPackages();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Package}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Package</b></em>' reference list.
@@ -306,7 +307,7 @@
 	 * @model type="org.eclipse.uml2.uml.ProfileApplication" opposite="applyingPackage" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getProfileApplications();
+	EList<ProfileApplication> getProfileApplications();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ProfileApplication} and appends it to the '<em><b>Profile Application</b></em>' containment reference list.
@@ -329,7 +330,7 @@
 	 * @generated
 	 */
 	boolean validateElementsPublicOrPrivate(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Package}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Nested Package</b></em>' reference list.
@@ -395,7 +396,7 @@
 	 * @model type="org.eclipse.emf.ecore.EObject" ordered="false" profileRequired="true" profileOrdered="false"
 	 * @generated
 	 */
-	EList applyProfile(Profile profile);
+	EList<EObject> applyProfile(Profile profile);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -406,7 +407,7 @@
 	 * @model type="org.eclipse.emf.ecore.EObject" ordered="false" profileRequired="true" profileOrdered="false"
 	 * @generated
 	 */
-	EList unapplyProfile(Profile profile);
+	EList<EObject> unapplyProfile(Profile profile);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -417,7 +418,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Profile" ordered="false"
 	 * @generated
 	 */
-	EList getAppliedProfiles();
+	EList<Profile> getAppliedProfiles();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -450,7 +451,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.ProfileApplication" ordered="false"
 	 * @generated
 	 */
-	EList getAllProfileApplications();
+	EList<ProfileApplication> getAllProfileApplications();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -505,7 +506,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Profile" ordered="false"
 	 * @generated
 	 */
-	EList getAllAppliedProfiles();
+	EList<Profile> getAllAppliedProfiles();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -517,7 +518,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageableElement" ordered="false"
 	 * @generated
 	 */
-	EList visibleMembers();
+	EList<PackageableElement> visibleMembers();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PackageImport.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PackageImport.java
index 2ff36b8..730998b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PackageImport.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PackageImport.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageImport.java,v 1.6 2006/05/12 20:38:09 khussey Exp $
+ * $Id: PackageImport.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -132,6 +132,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePublicOrPrivate(DiagnosticChain diagnostics, Map context);
+	boolean validatePublicOrPrivate(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // PackageImport
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Parameter.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Parameter.java
index 5d2b0b5..6d43f21 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Parameter.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Parameter.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Parameter.java,v 1.17 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Parameter.java,v 1.18 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -67,7 +67,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterSet" opposite="parameter" ordered="false"
 	 * @generated
 	 */
-	EList getParameterSets();
+	EList<ParameterSet> getParameterSets();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ParameterSet} with the specified '<em><b>Name</b></em>' from the '<em><b>Parameter Set</b></em>' reference list.
@@ -342,7 +342,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConnectorEnd(DiagnosticChain diagnostics, Map context);
+	boolean validateConnectorEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -354,7 +355,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateStreamAndException(DiagnosticChain diagnostics, Map context);
+	boolean validateStreamAndException(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -366,7 +368,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotException(DiagnosticChain diagnostics, Map context);
+	boolean validateNotException(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -378,7 +381,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateReentrantBehaviors(DiagnosticChain diagnostics, Map context);
+	boolean validateReentrantBehaviors(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -390,7 +394,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInAndOut(DiagnosticChain diagnostics, Map context);
+	boolean validateInAndOut(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterDirectionKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterDirectionKind.java
index ae05a29..9f06853 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterDirectionKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterDirectionKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterDirectionKind.java,v 1.4 2006/05/12 20:38:09 khussey Exp $
+ * $Id: ParameterDirectionKind.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,47 @@
  * @model
  * @generated
  */
-public final class ParameterDirectionKind
-		extends AbstractEnumerator {
+public enum ParameterDirectionKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>In</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IN
+	 * @generated
+	 * @ordered
+	 */
+	IN_LITERAL(0, "in", "in"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Inout</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INOUT
+	 * @generated
+	 * @ordered
+	 */
+	INOUT_LITERAL(1, "inout", "inout"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Out</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OUT
+	 * @generated
+	 * @ordered
+	 */
+	OUT_LITERAL(2, "out", "out"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Return</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RETURN
+	 * @generated
+	 * @ordered
+	 */
+	RETURN_LITERAL(3, "return", "return"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>In</b></em>' literal value.
@@ -90,50 +129,6 @@
 	public static final int RETURN = 3;
 
 	/**
-	 * The '<em><b>In</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #IN
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterDirectionKind IN_LITERAL = new ParameterDirectionKind(
-		IN, "in", "in"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Inout</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #INOUT
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterDirectionKind INOUT_LITERAL = new ParameterDirectionKind(
-		INOUT, "inout", "inout"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Out</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #OUT
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterDirectionKind OUT_LITERAL = new ParameterDirectionKind(
-		OUT, "out", "out"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Return</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #RETURN
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterDirectionKind RETURN_LITERAL = new ParameterDirectionKind(
-		RETURN, "return", "return"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Parameter Direction Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -148,8 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<ParameterDirectionKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Parameter Direction Kind</b></em>' literal with the specified literal value.
@@ -204,13 +199,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private ParameterDirectionKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //ParameterDirectionKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterEffectKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterEffectKind.java
index 3084a17..a87e6a7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterEffectKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterEffectKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterEffectKind.java,v 1.2 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ParameterEffectKind.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,47 @@
  * @model
  * @generated
  */
-public final class ParameterEffectKind
-		extends AbstractEnumerator {
+public enum ParameterEffectKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Create</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CREATE
+	 * @generated
+	 * @ordered
+	 */
+	CREATE_LITERAL(0, "create", "create"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Read</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #READ
+	 * @generated
+	 * @ordered
+	 */
+	READ_LITERAL(1, "read", "read"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Update</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UPDATE
+	 * @generated
+	 * @ordered
+	 */
+	UPDATE_LITERAL(2, "update", "update"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Delete</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DELETE
+	 * @generated
+	 * @ordered
+	 */
+	DELETE_LITERAL(3, "delete", "delete"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Create</b></em>' literal value.
@@ -90,50 +129,6 @@
 	public static final int DELETE = 3;
 
 	/**
-	 * The '<em><b>Create</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CREATE
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterEffectKind CREATE_LITERAL = new ParameterEffectKind(
-		CREATE, "create", "create"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Read</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #READ
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterEffectKind READ_LITERAL = new ParameterEffectKind(
-		READ, "read", "read"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Update</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UPDATE
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterEffectKind UPDATE_LITERAL = new ParameterEffectKind(
-		UPDATE, "update", "update"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Delete</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #DELETE
-	 * @generated
-	 * @ordered
-	 */
-	public static final ParameterEffectKind DELETE_LITERAL = new ParameterEffectKind(
-		DELETE, "delete", "delete"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Parameter Effect Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -148,8 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<ParameterEffectKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Parameter Effect Kind</b></em>' literal with the specified literal value.
@@ -204,13 +199,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private ParameterEffectKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //ParameterEffectKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterSet.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterSet.java
index ae21471..1fe050a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterSet.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ParameterSet.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterSet.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ParameterSet.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -59,7 +59,7 @@
 	 * @model type="org.eclipse.uml2.uml.Parameter" opposite="parameterSet" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getParameters();
+	EList<Parameter> getParameters();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Parameter} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Parameter</b></em>' reference list.
@@ -99,7 +99,7 @@
 	 * @model type="org.eclipse.uml2.uml.Constraint" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConditions();
+	EList<Constraint> getConditions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Constraint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Condition</b></em>' containment reference list.
@@ -161,7 +161,7 @@
 	 * @generated
 	 */
 	boolean validateSameParameterizedEntity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -173,7 +173,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInput(DiagnosticChain diagnostics, Map context);
+	boolean validateInput(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -185,6 +186,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTwoParameterSets(DiagnosticChain diagnostics, Map context);
+	boolean validateTwoParameterSets(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ParameterSet
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PartDecomposition.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PartDecomposition.java
index 64720c9..5c62477 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PartDecomposition.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PartDecomposition.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PartDecomposition.java,v 1.3 2006/05/12 20:38:04 khussey Exp $
+ * $Id: PartDecomposition.java,v 1.4 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -44,7 +44,7 @@
 	 * @generated
 	 */
 	boolean validatePartsOfInternalStructures(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -61,7 +61,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssume(DiagnosticChain diagnostics, Map context);
+	boolean validateAssume(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -76,6 +77,6 @@
 	 * @generated
 	 */
 	boolean validateCommutativityOfDecomposition(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // PartDecomposition
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pin.java
index 291cd64..efa26c1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pin.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Pin.java,v 1.4 2006/02/02 23:30:18 khussey Exp $
+ * $Id: Pin.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -76,6 +76,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateControlPins(DiagnosticChain diagnostics, Map context);
+	boolean validateControlPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Pin
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Port.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Port.java
index 85dd12f..5f6db7e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Port.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Port.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Port.java,v 1.7 2006/05/12 20:38:06 khussey Exp $
+ * $Id: Port.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -112,7 +112,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRequireds();
+	EList<Interface> getRequireds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Interface} with the specified '<em><b>Name</b></em>' from the '<em><b>Required</b></em>' reference list.
@@ -150,7 +150,7 @@
 	 * @model type="org.eclipse.uml2.uml.Port" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedPorts();
+	EList<Port> getRedefinedPorts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Port} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Redefined Port</b></em>' reference list.
@@ -191,7 +191,7 @@
 	 * @model type="org.eclipse.uml2.uml.Interface" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getProvideds();
+	EList<Interface> getProvideds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Interface} with the specified '<em><b>Name</b></em>' from the '<em><b>Provided</b></em>' reference list.
@@ -251,7 +251,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateRequiredInterfaces(DiagnosticChain diagnostics, Map context);
+	boolean validateRequiredInterfaces(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -263,7 +264,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePortAggregation(DiagnosticChain diagnostics, Map context);
+	boolean validatePortAggregation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -275,7 +277,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePortDestroyed(DiagnosticChain diagnostics, Map context);
+	boolean validatePortDestroyed(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -287,6 +290,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDefaultValue(DiagnosticChain diagnostics, Map context);
+	boolean validateDefaultValue(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Port
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Profile.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Profile.java
index d883b18..e064977 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Profile.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Profile.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Profile.java,v 1.13 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Profile.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -60,7 +60,7 @@
 	 * @model type="org.eclipse.uml2.uml.Stereotype" transient="true" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedStereotypes();
+	EList<Stereotype> getOwnedStereotypes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Stereotype}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Stereotype</b></em>' reference list.
@@ -111,7 +111,7 @@
 	 * @model type="org.eclipse.uml2.uml.ElementImport" ordered="false"
 	 * @generated
 	 */
-	EList getMetaclassReferences();
+	EList<ElementImport> getMetaclassReferences();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ElementImport}, with the specified '<em><b>Imported Element</b></em>', and appends it to the '<em><b>Metaclass Reference</b></em>' reference list.
@@ -161,7 +161,7 @@
 	 * @model type="org.eclipse.uml2.uml.PackageImport" ordered="false"
 	 * @generated
 	 */
-	EList getMetamodelReferences();
+	EList<PackageImport> getMetamodelReferences();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.PackageImport}, with the specified '<em><b>Imported Package</b></em>', and appends it to the '<em><b>Metamodel Reference</b></em>' reference list.
@@ -214,7 +214,7 @@
 	 * @generated
 	 */
 	boolean validateMetaclassReferenceNotSpecialized(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -228,7 +228,7 @@
 	 * @generated
 	 */
 	boolean validateReferencesSameMetamodel(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -305,7 +305,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Class" ordered="false"
 	 * @generated
 	 */
-	EList getReferencedMetaclasses();
+	EList<org.eclipse.uml2.uml.Class> getReferencedMetaclasses();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -316,7 +316,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Model" ordered="false"
 	 * @generated
 	 */
-	EList getReferencedMetamodels();
+	EList<Model> getReferencedMetamodels();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -327,6 +327,6 @@
 	 * @model type="org.eclipse.uml2.uml.Extension" ordered="false" requiredOnlyDataType="org.eclipse.uml2.uml.Boolean" requiredOnlyRequired="true" requiredOnlyOrdered="false"
 	 * @generated
 	 */
-	EList getOwnedExtensions(boolean requiredOnly);
+	EList<Extension> getOwnedExtensions(boolean requiredOnly);
 
 } // Profile
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Property.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Property.java
index 3a22963..18fbe4d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Property.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Property.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Property.java,v 1.22 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Property.java,v 1.23 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -278,7 +278,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedProperties();
+	EList<Property> getRedefinedProperties();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Property} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Redefined Property</b></em>' reference list.
@@ -437,7 +437,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" ordered="false"
 	 * @generated
 	 */
-	EList getSubsettedProperties();
+	EList<Property> getSubsettedProperties();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Property} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Subsetted Property</b></em>' reference list.
@@ -481,7 +481,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" opposite="associationEnd" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getQualifiers();
+	EList<Property> getQualifiers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Qualifier</b></em>' containment reference list.
@@ -575,7 +575,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfComposite(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -591,7 +591,7 @@
 	 * @generated
 	 */
 	boolean validateSubsettingContextConforms(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -608,7 +608,7 @@
 	 * @generated
 	 */
 	boolean validateRedefinedPropertyInherited(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -623,7 +623,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSubsettingRules(DiagnosticChain diagnostics, Map context);
+	boolean validateSubsettingRules(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -635,7 +636,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNavigableReadonly(DiagnosticChain diagnostics, Map context);
+	boolean validateNavigableReadonly(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -648,7 +650,7 @@
 	 * @generated
 	 */
 	boolean validateDerivedUnionIsDerived(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -661,7 +663,7 @@
 	 * @generated
 	 */
 	boolean validateDerivedUnionIsReadOnly(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -674,7 +676,7 @@
 	 * @generated
 	 */
 	boolean validateSubsettedPropertyNames(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -686,7 +688,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeploymentTarget(DiagnosticChain diagnostics, Map context);
+	boolean validateDeploymentTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -699,7 +702,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBindingToAttribute(DiagnosticChain diagnostics, Map context);
+	boolean validateBindingToAttribute(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -803,7 +807,7 @@
 	 * @model type="org.eclipse.uml2.uml.Type" ordered="false"
 	 * @generated
 	 */
-	EList subsettingContext();
+	EList<Type> subsettingContext();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolStateMachine.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolStateMachine.java
index bd7d19e..2a5480f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolStateMachine.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolStateMachine.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolStateMachine.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ProtocolStateMachine.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.ProtocolConformance" opposite="specificMachine" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConformances();
+	EList<ProtocolConformance> getConformances();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ProtocolConformance}, with the specified '<em><b>General Machine</b></em>', and appends it to the '<em><b>Conformance</b></em>' containment reference list.
@@ -103,7 +103,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateProtocolTransitions(DiagnosticChain diagnostics, Map context);
+	boolean validateProtocolTransitions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -117,7 +118,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEntryExitDo(DiagnosticChain diagnostics, Map context);
+	boolean validateEntryExitDo(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -132,7 +134,7 @@
 	 * @generated
 	 */
 	boolean validateDeepOrShallowHistory(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -144,6 +146,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePortsConnected(DiagnosticChain diagnostics, Map context);
+	boolean validatePortsConnected(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ProtocolStateMachine
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolTransition.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolTransition.java
index 0b5ea59..1e03d85 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolTransition.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ProtocolTransition.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolTransition.java,v 1.15 2006/05/12 20:38:03 khussey Exp $
+ * $Id: ProtocolTransition.java,v 1.16 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -107,7 +107,7 @@
 	 * @model type="org.eclipse.uml2.uml.Operation" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getReferreds();
+	EList<Operation> getReferreds();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Referred</b></em>' reference list.
@@ -120,8 +120,8 @@
 	 * @see #getReferreds()
 	 * @generated
 	 */
-	Operation getReferred(String name, EList ownedParameterNames,
-			EList ownedParameterTypes);
+	Operation getReferred(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes);
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Operation} with the specified '<em><b>Name</b></em>', '<em><b>Owned Parameter Names</b></em>', and '<em><b>Owned Parameter Types</b></em>' from the '<em><b>Referred</b></em>' reference list.
@@ -135,8 +135,8 @@
 	 * @see #getReferreds()
 	 * @generated
 	 */
-	Operation getReferred(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase);
+	Operation getReferred(String name, EList<String> ownedParameterNames,
+			EList<Type> ownedParameterTypes, boolean ignoreCase);
 
 	/**
 	 * Returns the value of the '<em><b>Pre Condition</b></em>' reference.
@@ -173,7 +173,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBelongsToPsm(DiagnosticChain diagnostics, Map context);
+	boolean validateBelongsToPsm(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -185,7 +186,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAssociatedActions(DiagnosticChain diagnostics, Map context);
+	boolean validateAssociatedActions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -197,6 +199,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateRefersToOperation(DiagnosticChain diagnostics, Map context);
+	boolean validateRefersToOperation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ProtocolTransition
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pseudostate.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pseudostate.java
index c0ecf31..4410ae8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pseudostate.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Pseudostate.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Pseudostate.java,v 1.8 2006/05/12 20:38:04 khussey Exp $
+ * $Id: Pseudostate.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -134,7 +134,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInitialVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateInitialVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -148,7 +149,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateHistoryVertices(DiagnosticChain diagnostics, Map context);
+	boolean validateHistoryVertices(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -162,7 +164,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateJoinVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateJoinVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -176,7 +179,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTransitionsIncoming(DiagnosticChain diagnostics, Map context);
+	boolean validateTransitionsIncoming(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -190,7 +194,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateForkVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateForkVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -204,7 +209,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTransitionsOutgoing(DiagnosticChain diagnostics, Map context);
+	boolean validateTransitionsOutgoing(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -218,7 +224,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateJunctionVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateJunctionVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -232,7 +239,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateChoiceVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateChoiceVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -245,6 +253,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOutgoingFromInitial(DiagnosticChain diagnostics, Map context);
+	boolean validateOutgoingFromInitial(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Pseudostate
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PseudostateKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PseudostateKind.java
index 153a688..a2d4996 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PseudostateKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/PseudostateKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PseudostateKind.java,v 1.4 2006/05/12 20:38:09 khussey Exp $
+ * $Id: PseudostateKind.java,v 1.5 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,107 @@
  * @model
  * @generated
  */
-public final class PseudostateKind
-		extends AbstractEnumerator {
+public enum PseudostateKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Initial</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INITIAL
+	 * @generated
+	 * @ordered
+	 */
+	INITIAL_LITERAL(0, "initial", "initial"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Deep History</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DEEP_HISTORY
+	 * @generated
+	 * @ordered
+	 */
+	DEEP_HISTORY_LITERAL(1, "deepHistory", "deepHistory"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Shallow History</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SHALLOW_HISTORY
+	 * @generated
+	 * @ordered
+	 */
+	SHALLOW_HISTORY_LITERAL(2, "shallowHistory", "shallowHistory"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Join</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #JOIN
+	 * @generated
+	 * @ordered
+	 */
+	JOIN_LITERAL(3, "join", "join"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Fork</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FORK
+	 * @generated
+	 * @ordered
+	 */
+	FORK_LITERAL(4, "fork", "fork"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Junction</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #JUNCTION
+	 * @generated
+	 * @ordered
+	 */
+	JUNCTION_LITERAL(5, "junction", "junction"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Choice</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CHOICE
+	 * @generated
+	 * @ordered
+	 */
+	CHOICE_LITERAL(6, "choice", "choice"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Entry Point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ENTRY_POINT
+	 * @generated
+	 * @ordered
+	 */
+	ENTRY_POINT_LITERAL(7, "entryPoint", "entryPoint"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Exit Point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #EXIT_POINT
+	 * @generated
+	 * @ordered
+	 */
+	EXIT_POINT_LITERAL(8, "exitPoint", "exitPoint"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Terminate</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TERMINATE
+	 * @generated
+	 * @ordered
+	 */
+	TERMINATE_LITERAL(9, "terminate", "terminate"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Initial</b></em>' literal value.
@@ -175,116 +274,6 @@
 	public static final int TERMINATE = 9;
 
 	/**
-	 * The '<em><b>Initial</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #INITIAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind INITIAL_LITERAL = new PseudostateKind(
-		INITIAL, "initial", "initial"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Deep History</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #DEEP_HISTORY
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind DEEP_HISTORY_LITERAL = new PseudostateKind(
-		DEEP_HISTORY, "deepHistory", "deepHistory"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Shallow History</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SHALLOW_HISTORY
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind SHALLOW_HISTORY_LITERAL = new PseudostateKind(
-		SHALLOW_HISTORY, "shallowHistory", "shallowHistory"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Join</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #JOIN
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind JOIN_LITERAL = new PseudostateKind(
-		JOIN, "join", "join"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Fork</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FORK
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind FORK_LITERAL = new PseudostateKind(
-		FORK, "fork", "fork"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Junction</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #JUNCTION
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind JUNCTION_LITERAL = new PseudostateKind(
-		JUNCTION, "junction", "junction"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Choice</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CHOICE
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind CHOICE_LITERAL = new PseudostateKind(
-		CHOICE, "choice", "choice"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Entry Point</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ENTRY_POINT
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind ENTRY_POINT_LITERAL = new PseudostateKind(
-		ENTRY_POINT, "entryPoint", "entryPoint"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Exit Point</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXIT_POINT
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind EXIT_POINT_LITERAL = new PseudostateKind(
-		EXIT_POINT, "exitPoint", "exitPoint"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Terminate</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #TERMINATE
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudostateKind TERMINATE_LITERAL = new PseudostateKind(
-		TERMINATE, "terminate", "terminate"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Pseudostate Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -301,8 +290,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<PseudostateKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Pseudostate Kind</b></em>' literal with the specified literal value.
@@ -369,13 +358,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private PseudostateKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //PseudostateKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/QualifierValue.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/QualifierValue.java
index 42db754..e8e2519 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/QualifierValue.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/QualifierValue.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: QualifierValue.java,v 1.2 2006/05/12 20:38:07 khussey Exp $
+ * $Id: QualifierValue.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -100,7 +100,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateQualifierAttribute(DiagnosticChain diagnostics, Map context);
+	boolean validateQualifierAttribute(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,7 +113,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeOfQualifier(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeOfQualifier(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -125,6 +127,6 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // QualifierValue
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadExtentAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadExtentAction.java
index 624e4c9..f9864be 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadExtentAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadExtentAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadExtentAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ReadExtentAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -112,7 +112,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeIsClassifier(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeIsClassifier(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -125,6 +126,6 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ReadExtentAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadIsClassifiedObjectAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadIsClassifiedObjectAction.java
index 3d97096..f01d180 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadIsClassifiedObjectAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadIsClassifiedObjectAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadIsClassifiedObjectAction.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ReadIsClassifiedObjectAction.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -192,7 +192,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicityOfInput(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicityOfInput(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -204,7 +205,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoType(DiagnosticChain diagnostics, Map context);
+	boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -217,7 +219,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfOutput(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -229,6 +231,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBooleanResult(DiagnosticChain diagnostics, Map context);
+	boolean validateBooleanResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReadIsClassifiedObjectAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkAction.java
index 216a2d8..1941157 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkAction.java,v 1.7 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ReadLinkAction.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -87,7 +87,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOneOpenEnd(DiagnosticChain diagnostics, Map context);
+	boolean validateOneOpenEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -102,7 +103,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeAndOrdering(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -117,7 +119,7 @@
 	 * @generated
 	 */
 	boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -131,7 +133,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNavigableOpenEnd(DiagnosticChain diagnostics, Map context);
+	boolean validateNavigableOpenEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -150,6 +153,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateVisibility(DiagnosticChain diagnostics, Map context);
+	boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReadLinkAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndAction.java
index 811d82b..f55f7d7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndAction.java,v 1.6 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ReadLinkObjectEndAction.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -165,7 +165,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateProperty(DiagnosticChain diagnostics, Map context);
+	boolean validateProperty(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -178,7 +179,7 @@
 	 * @generated
 	 */
 	boolean validateAssociationOfAssociation(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -190,7 +191,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEndsOfAssociation(DiagnosticChain diagnostics, Map context);
+	boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -202,7 +204,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeOfObject(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeOfObject(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -215,7 +218,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -227,7 +230,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeOfResult(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeOfResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -240,6 +244,6 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ReadLinkObjectEndAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndQualifierAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndQualifierAction.java
index cb65551..da23f91 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndQualifierAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadLinkObjectEndQualifierAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndQualifierAction.java,v 1.6 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ReadLinkObjectEndQualifierAction.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -165,7 +165,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateQualifierAttribute(DiagnosticChain diagnostics, Map context);
+	boolean validateQualifierAttribute(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -178,7 +179,7 @@
 	 * @generated
 	 */
 	boolean validateAssociationOfAssociation(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -190,7 +191,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEndsOfAssociation(DiagnosticChain diagnostics, Map context);
+	boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -202,7 +204,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeOfObject(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeOfObject(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -215,7 +218,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -228,7 +231,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -240,7 +243,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -253,6 +257,6 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ReadLinkObjectEndQualifierAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadSelfAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadSelfAction.java
index 9114cc2..1d42cf5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadSelfAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadSelfAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadSelfAction.java,v 1.7 2006/06/07 21:39:13 khussey Exp $
+ * $Id: ReadSelfAction.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -86,7 +86,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateContained(DiagnosticChain diagnostics, Map context);
+	boolean validateContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,7 +99,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotStatic(DiagnosticChain diagnostics, Map context);
+	boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -110,7 +112,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateType(DiagnosticChain diagnostics, Map context);
+	boolean validateType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -122,6 +125,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReadSelfAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadStructuralFeatureAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadStructuralFeatureAction.java
index 69e1e4c..812915f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadStructuralFeatureAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadStructuralFeatureAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadStructuralFeatureAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ReadStructuralFeatureAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -88,6 +88,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeAndOrdering(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReadStructuralFeatureAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadVariableAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadVariableAction.java
index a93a321..9d32d0d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadVariableAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReadVariableAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadVariableAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ReadVariableAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -88,7 +88,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeAndOrdering(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -101,6 +102,6 @@
 	 * @generated
 	 */
 	boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ReadVariableAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Reception.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Reception.java
index f0bf675..a8ef3ab 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Reception.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Reception.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Reception.java,v 1.1 2005/11/14 22:26:01 khussey Exp $
+ * $Id: Reception.java,v 1.2 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,6 +74,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotQuery(DiagnosticChain diagnostics, Map context);
+	boolean validateNotQuery(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // Reception
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReclassifyObjectAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReclassifyObjectAction.java
index 3fb18c9..4ba8aa0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReclassifyObjectAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReclassifyObjectAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReclassifyObjectAction.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ReclassifyObjectAction.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -85,7 +85,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList getOldClassifiers();
+	EList<Classifier> getOldClassifiers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Old Classifier</b></em>' reference list.
@@ -124,7 +124,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" ordered="false"
 	 * @generated
 	 */
-	EList getNewClassifiers();
+	EList<Classifier> getNewClassifiers();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>New Classifier</b></em>' reference list.
@@ -211,7 +211,7 @@
 	 * @generated
 	 */
 	boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -223,7 +223,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -235,6 +236,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReclassifyObjectAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableElement.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableElement.java
index 4fa79ad..a290757 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableElement.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableElement.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableElement.java,v 1.10 2006/05/24 20:54:29 khussey Exp $
+ * $Id: RedefinableElement.java,v 1.11 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -84,7 +84,7 @@
 	 * @model type="org.eclipse.uml2.uml.RedefinableElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinedElements();
+	EList<RedefinableElement> getRedefinedElements();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.RedefinableElement} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefined Element</b></em>' reference list.
@@ -124,7 +124,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRedefinitionContexts();
+	EList<Classifier> getRedefinitionContexts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Redefinition Context</b></em>' reference list.
@@ -162,7 +162,7 @@
 	 * @generated
 	 */
 	boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -175,7 +175,7 @@
 	 * @generated
 	 */
 	boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableTemplateSignature.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableTemplateSignature.java
index 4e9c33c..e301a1f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableTemplateSignature.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RedefinableTemplateSignature.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableTemplateSignature.java,v 1.7 2006/05/12 20:38:03 khussey Exp $
+ * $Id: RedefinableTemplateSignature.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.RedefinableTemplateSignature" ordered="false"
 	 * @generated
 	 */
-	EList getExtendedSignatures();
+	EList<RedefinableTemplateSignature> getExtendedSignatures();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.RedefinableTemplateSignature} with the specified '<em><b>Name</b></em>' from the '<em><b>Extended Signature</b></em>' reference list.
@@ -95,7 +95,7 @@
 	 * @model type="org.eclipse.uml2.uml.TemplateParameter" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getInheritedParameters();
+	EList<TemplateParameter> getInheritedParameters();
 
 	/**
 	 * Returns the value of the '<em><b>Classifier</b></em>' reference.
@@ -121,6 +121,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInheritedParameters(DiagnosticChain diagnostics, Map context);
+	boolean validateInheritedParameters(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // RedefinableTemplateSignature
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReduceAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReduceAction.java
index e6cdec3..a77772a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReduceAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReduceAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReduceAction.java,v 1.6 2006/05/26 16:34:02 khussey Exp $
+ * $Id: ReduceAction.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -193,7 +193,7 @@
 	 * @generated
 	 */
 	boolean validateInputTypeIsCollection(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -206,7 +206,7 @@
 	 * @generated
 	 */
 	boolean validateOutputTypesAreCompatible(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -218,6 +218,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateReducerInputsOutput(DiagnosticChain diagnostics, Map context);
+	boolean validateReducerInputsOutput(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ReduceAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Region.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Region.java
index e1be032..f7e8eb0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Region.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Region.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Region.java,v 1.11 2006/05/26 16:34:02 khussey Exp $
+ * $Id: Region.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -62,7 +62,7 @@
 	 * @model type="org.eclipse.uml2.uml.Vertex" opposite="container" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getSubvertices();
+	EList<Vertex> getSubvertices();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Vertex}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Subvertex</b></em>' containment reference list.
@@ -117,7 +117,7 @@
 	 * @model type="org.eclipse.uml2.uml.Transition" opposite="container" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getTransitions();
+	EList<Transition> getTransitions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Transition}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Transition</b></em>' containment reference list.
@@ -259,7 +259,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInitialVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateInitialVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -273,7 +274,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateDeepHistoryVertex(DiagnosticChain diagnostics, Map context);
+	boolean validateDeepHistoryVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -288,7 +290,7 @@
 	 * @generated
 	 */
 	boolean validateShallowHistoryVertex(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -300,7 +302,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwned(DiagnosticChain diagnostics, Map context);
+	boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Relationship.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Relationship.java
index 42c3d86..5f665a8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Relationship.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Relationship.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Relationship.java,v 1.4 2006/05/24 20:54:29 khussey Exp $
+ * $Id: Relationship.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -50,6 +50,6 @@
 	 * @model type="org.eclipse.uml2.uml.Element" required="true" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRelatedElements();
+	EList<Element> getRelatedElements();
 
 } // Relationship
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveStructuralFeatureValueAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveStructuralFeatureValueAction.java
index 8fefffc..a8fec2e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveStructuralFeatureValueAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveStructuralFeatureValueAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveStructuralFeatureValueAction.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: RemoveStructuralFeatureValueAction.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -129,6 +129,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNonUniqueRemoval(DiagnosticChain diagnostics, Map context);
+	boolean validateNonUniqueRemoval(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // RemoveStructuralFeatureValueAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveVariableValueAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveVariableValueAction.java
index 9e4ead5..38748d7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveVariableValueAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/RemoveVariableValueAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveVariableValueAction.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: RemoveVariableValueAction.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -128,6 +128,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateUnlimitedNatural(DiagnosticChain diagnostics, Map context);
+	boolean validateUnlimitedNatural(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // RemoveVariableValueAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReplyAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReplyAction.java
index 2768251..fe706bf 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReplyAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ReplyAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReplyAction.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ReplyAction.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -133,7 +133,7 @@
 	 * @model type="org.eclipse.uml2.uml.InputPin" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getReplyValues();
+	EList<InputPin> getReplyValues();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.InputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Reply Value</b></em>' containment reference list.
@@ -198,7 +198,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validatePinsMatchParameter(DiagnosticChain diagnostics, Map context);
+	boolean validatePinsMatchParameter(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -211,6 +212,6 @@
 	 * @generated
 	 */
 	boolean validateEventOnReplyToCallTrigger(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // ReplyAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SendSignalAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SendSignalAction.java
index 8a7cf4d..4878f99 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SendSignalAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SendSignalAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendSignalAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: SendSignalAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -127,7 +127,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNumberOrder(DiagnosticChain diagnostics, Map context);
+	boolean validateNumberOrder(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -140,6 +141,6 @@
 	 * @generated
 	 */
 	boolean validateTypeOrderingMultiplicity(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // SendSignalAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SequenceNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SequenceNode.java
index e2c9cb8..cd33f3c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SequenceNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/SequenceNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SequenceNode.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: SequenceNode.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -52,7 +52,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExecutableNode" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getExecutableNodes();
+	EList<ExecutableNode> getExecutableNodes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ExecutableNode}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Executable Node</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Signal.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Signal.java
index 8974be5..2ea6568 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Signal.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Signal.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Signal.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Signal.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -52,7 +52,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedAttributes();
+	EList<Property> getOwnedAttributes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Attribute</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Slot.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Slot.java
index c1a5f0e..7ef11ec 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Slot.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Slot.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Slot.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Slot.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -106,7 +106,7 @@
 	 * @model type="org.eclipse.uml2.uml.ValueSpecification" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getValues();
+	EList<ValueSpecification> getValues();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ValueSpecification}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Value</b></em>' containment reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StartClassifierBehaviorAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StartClassifierBehaviorAction.java
index b8834ff..da89553 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StartClassifierBehaviorAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StartClassifierBehaviorAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StartClassifierBehaviorAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: StartClassifierBehaviorAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -101,7 +101,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -113,6 +114,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeHasClassifier(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeHasClassifier(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // StartClassifierBehaviorAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/State.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/State.java
index bd32f8e..31cccba 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/State.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/State.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: State.java,v 1.15 2006/05/26 16:34:02 khussey Exp $
+ * $Id: State.java,v 1.16 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -159,7 +159,7 @@
 	 * @model type="org.eclipse.uml2.uml.ConnectionPointReference" opposite="state" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConnections();
+	EList<ConnectionPointReference> getConnections();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ConnectionPointReference}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Connection</b></em>' containment reference list.
@@ -212,7 +212,7 @@
 	 * @model type="org.eclipse.uml2.uml.Pseudostate" opposite="state" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConnectionPoints();
+	EList<Pseudostate> getConnectionPoints();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Pseudostate}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Connection Point</b></em>' containment reference list.
@@ -450,7 +450,7 @@
 	 * @model type="org.eclipse.uml2.uml.Trigger" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getDeferrableTriggers();
+	EList<Trigger> getDeferrableTriggers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Trigger}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Deferrable Trigger</b></em>' containment reference list.
@@ -503,7 +503,7 @@
 	 * @model type="org.eclipse.uml2.uml.Region" opposite="state" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getRegions();
+	EList<Region> getRegions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Region}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Region</b></em>' containment reference list.
@@ -550,7 +550,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSubmachineStates(DiagnosticChain diagnostics, Map context);
+	boolean validateSubmachineStates(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -565,7 +566,7 @@
 	 * @generated
 	 */
 	boolean validateDestinationsOrSourcesOfTransitions(
-			DiagnosticChain diagnostics, Map context);
+			DiagnosticChain diagnostics, Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -577,7 +578,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSubmachineOrRegions(DiagnosticChain diagnostics, Map context);
+	boolean validateSubmachineOrRegions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -589,7 +591,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCompositeStates(DiagnosticChain diagnostics, Map context);
+	boolean validateCompositeStates(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -601,7 +604,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEntryOrExit(DiagnosticChain diagnostics, Map context);
+	boolean validateEntryOrExit(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StateMachine.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StateMachine.java
index c4953a9..ded5b03 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StateMachine.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StateMachine.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateMachine.java,v 1.10 2006/05/26 16:34:03 khussey Exp $
+ * $Id: StateMachine.java,v 1.11 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -61,7 +61,7 @@
 	 * @model type="org.eclipse.uml2.uml.Region" opposite="stateMachine" containment="true" resolveProxies="true" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getRegions();
+	EList<Region> getRegions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Region}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Region</b></em>' containment reference list.
@@ -113,7 +113,7 @@
 	 * @model type="org.eclipse.uml2.uml.State" opposite="submachine" ordered="false"
 	 * @generated
 	 */
-	EList getSubmachineStates();
+	EList<State> getSubmachineStates();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.State} with the specified '<em><b>Name</b></em>' from the '<em><b>Submachine State</b></em>' reference list.
@@ -154,7 +154,7 @@
 	 * @model type="org.eclipse.uml2.uml.Pseudostate" opposite="stateMachine" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getConnectionPoints();
+	EList<Pseudostate> getConnectionPoints();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Pseudostate}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Connection Point</b></em>' containment reference list.
@@ -205,7 +205,7 @@
 	 * @model type="org.eclipse.uml2.uml.StateMachine" ordered="false"
 	 * @generated
 	 */
-	EList getExtendedStateMachines();
+	EList<StateMachine> getExtendedStateMachines();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.StateMachine} with the specified '<em><b>Name</b></em>' from the '<em><b>Extended State Machine</b></em>' reference list.
@@ -242,7 +242,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateClassifierContext(DiagnosticChain diagnostics, Map context);
+	boolean validateClassifierContext(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -254,7 +255,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateContextClassifier(DiagnosticChain diagnostics, Map context);
+	boolean validateContextClassifier(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -266,7 +268,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateConnectionPoints(DiagnosticChain diagnostics, Map context);
+	boolean validateConnectionPoints(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -278,7 +281,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMethod(DiagnosticChain diagnostics, Map context);
+	boolean validateMethod(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Stereotype.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Stereotype.java
index 8e03925..3e8cdb3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Stereotype.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Stereotype.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Stereotype.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: Stereotype.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.Image" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getIcons();
+	EList<Image> getIcons();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Image} and appends it to the '<em><b>Icon</b></em>' containment reference list.
@@ -78,7 +78,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNameNotClash(DiagnosticChain diagnostics, Map context);
+	boolean validateNameNotClash(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -90,7 +91,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateGeneralize(DiagnosticChain diagnostics, Map context);
+	boolean validateGeneralize(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -146,7 +148,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Class" ordered="false"
 	 * @generated
 	 */
-	EList getExtendedMetaclasses();
+	EList<org.eclipse.uml2.uml.Class> getExtendedMetaclasses();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -157,7 +159,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Class" ordered="false"
 	 * @generated
 	 */
-	EList getAllExtendedMetaclasses();
+	EList<org.eclipse.uml2.uml.Class> getAllExtendedMetaclasses();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StringExpression.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StringExpression.java
index fb8b57a..50a1f19 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StringExpression.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StringExpression.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StringExpression.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: StringExpression.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -57,7 +57,7 @@
 	 * @model type="org.eclipse.uml2.uml.StringExpression" opposite="owningExpression" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getSubExpressions();
+	EList<StringExpression> getSubExpressions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.StringExpression}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Sub Expression</b></em>' containment reference list.
@@ -135,7 +135,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOperands(DiagnosticChain diagnostics, Map context);
+	boolean validateOperands(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -149,6 +150,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSubexpressions(DiagnosticChain diagnostics, Map context);
+	boolean validateSubexpressions(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // StringExpression
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuralFeatureAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuralFeatureAction.java
index d532389..e688c15 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuralFeatureAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuralFeatureAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuralFeatureAction.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: StructuralFeatureAction.java,v 1.7 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -128,7 +128,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNotStatic(DiagnosticChain diagnostics, Map context);
+	boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -140,7 +141,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -152,7 +154,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -169,7 +172,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateVisibility(DiagnosticChain diagnostics, Map context);
+	boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -182,6 +186,6 @@
 	 * @generated
 	 */
 	boolean validateOneFeaturingClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // StructuralFeatureAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredActivityNode.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredActivityNode.java
index 892521a..32f1e57 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredActivityNode.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredActivityNode.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredActivityNode.java,v 1.13 2006/05/26 16:34:03 khussey Exp $
+ * $Id: StructuredActivityNode.java,v 1.14 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -62,7 +62,7 @@
 	 * @model type="org.eclipse.uml2.uml.Variable" opposite="scope" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getVariables();
+	EList<Variable> getVariables();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Variable}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Variable</b></em>' containment reference list.
@@ -118,7 +118,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityNode" opposite="inStructuredNode" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getNodes();
+	EList<ActivityNode> getNodes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityNode}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Node</b></em>' containment reference list.
@@ -199,7 +199,7 @@
 	 * @model type="org.eclipse.uml2.uml.ActivityEdge" opposite="inStructuredNode" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getEdges();
+	EList<ActivityEdge> getEdges();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ActivityEdge}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Edge</b></em>' containment reference list.
@@ -249,6 +249,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // StructuredActivityNode
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredClassifier.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredClassifier.java
index 81bbafe..36fb9d8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredClassifier.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/StructuredClassifier.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredClassifier.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: StructuredClassifier.java,v 1.8 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -59,7 +59,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedAttributes();
+	EList<Property> getOwnedAttributes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Property}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Owned Attribute</b></em>' containment reference list.
@@ -127,7 +127,7 @@
 	 * @model type="org.eclipse.uml2.uml.Property" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getParts();
+	EList<Property> getParts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Property} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Part</b></em>' reference list.
@@ -168,7 +168,7 @@
 	 * @model type="org.eclipse.uml2.uml.ConnectableElement" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
 	 * @generated
 	 */
-	EList getRoles();
+	EList<ConnectableElement> getRoles();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.ConnectableElement} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Role</b></em>' reference list.
@@ -210,7 +210,7 @@
 	 * @model type="org.eclipse.uml2.uml.Connector" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedConnectors();
+	EList<Connector> getOwnedConnectors();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Connector}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Owned Connector</b></em>' containment reference list.
@@ -258,7 +258,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicities(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicities(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateBinding.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateBinding.java
index 8b4e2b5..852983c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateBinding.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateBinding.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateBinding.java,v 1.9 2006/05/26 16:34:03 khussey Exp $
+ * $Id: TemplateBinding.java,v 1.10 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -83,7 +83,7 @@
 	 * @model type="org.eclipse.uml2.uml.TemplateParameterSubstitution" opposite="templateBinding" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getParameterSubstitutions();
+	EList<TemplateParameterSubstitution> getParameterSubstitutions();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.TemplateParameterSubstitution} and appends it to the '<em><b>Parameter Substitution</b></em>' containment reference list.
@@ -133,7 +133,7 @@
 	 * @generated
 	 */
 	boolean validateParameterSubstitutionFormal(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -146,6 +146,6 @@
 	 * @generated
 	 */
 	boolean validateOneParameterSubstitution(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // TemplateBinding
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameter.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameter.java
index 7084e91..46e3ee1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameter.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameter.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameter.java,v 1.8 2006/05/26 16:34:02 khussey Exp $
+ * $Id: TemplateParameter.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -208,6 +208,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustBeCompatible(DiagnosticChain diagnostics, Map context);
+	boolean validateMustBeCompatible(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // TemplateParameter
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameterSubstitution.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameterSubstitution.java
index 395fd80..70ec3db 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameterSubstitution.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateParameterSubstitution.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameterSubstitution.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: TemplateParameterSubstitution.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -84,7 +84,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterableElement" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getActuals();
+	EList<ParameterableElement> getActuals();
 
 	/**
 	 * Returns the value of the '<em><b>Owned Actual</b></em>' containment reference list.
@@ -99,7 +99,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterableElement" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getOwnedActuals();
+	EList<ParameterableElement> getOwnedActuals();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ParameterableElement} and appends it to the '<em><b>Owned Actual</b></em>' containment reference list.
@@ -149,6 +149,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustBeCompatible(DiagnosticChain diagnostics, Map context);
+	boolean validateMustBeCompatible(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // TemplateParameterSubstitution
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateSignature.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateSignature.java
index 86a5a01..2f5489e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateSignature.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateSignature.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateSignature.java,v 1.9 2006/05/26 16:34:03 khussey Exp $
+ * $Id: TemplateSignature.java,v 1.10 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.TemplateParameter" required="true"
 	 * @generated
 	 */
-	EList getParameters();
+	EList<TemplateParameter> getParameters();
 
 	/**
 	 * Returns the value of the '<em><b>Template</b></em>' container reference.
@@ -102,7 +102,7 @@
 	 * @model type="org.eclipse.uml2.uml.TemplateParameter" opposite="signature" containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList getOwnedParameters();
+	EList<TemplateParameter> getOwnedParameters();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.TemplateParameter} and appends it to the '<em><b>Owned Parameter</b></em>' containment reference list.
@@ -135,6 +135,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwnElements(DiagnosticChain diagnostics, Map context);
+	boolean validateOwnElements(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // TemplateSignature
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateableElement.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateableElement.java
index b0e9d71..bcfd2e2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateableElement.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TemplateableElement.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateableElement.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: TemplateableElement.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -55,7 +55,7 @@
 	 * @model type="org.eclipse.uml2.uml.TemplateBinding" opposite="boundElement" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getTemplateBindings();
+	EList<TemplateBinding> getTemplateBindings();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.TemplateBinding}, with the specified '<em><b>Signature</b></em>', and appends it to the '<em><b>Template Binding</b></em>' containment reference list.
@@ -150,7 +150,7 @@
 	 * @model type="org.eclipse.uml2.uml.ParameterableElement" ordered="false"
 	 * @generated
 	 */
-	EList parameterableElements();
+	EList<ParameterableElement> parameterableElements();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TestIdentityAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TestIdentityAction.java
index f2e8053..f3dddb3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TestIdentityAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TestIdentityAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TestIdentityAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: TestIdentityAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -192,7 +192,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoType(DiagnosticChain diagnostics, Map context);
+	boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -206,7 +207,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -218,6 +220,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateResultIsBoolean(DiagnosticChain diagnostics, Map context);
+	boolean validateResultIsBoolean(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // TestIdentityAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeEvent.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeEvent.java
index 2b821f8..ffe6da2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeEvent.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeEvent.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeEvent.java,v 1.9 2006/05/26 16:34:02 khussey Exp $
+ * $Id: TimeEvent.java,v 1.10 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -117,7 +117,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateWhenNonNegative(DiagnosticChain diagnostics, Map context);
+	boolean validateWhenNonNegative(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -129,6 +130,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateStartingTime(DiagnosticChain diagnostics, Map context);
+	boolean validateStartingTime(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // TimeEvent
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeExpression.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeExpression.java
index b07c77a..145008c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeExpression.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TimeExpression.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeExpression.java,v 1.5 2006/05/12 20:38:04 khussey Exp $
+ * $Id: TimeExpression.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -78,7 +78,7 @@
 	 * @model type="org.eclipse.uml2.uml.Observation" ordered="false"
 	 * @generated
 	 */
-	EList getObservations();
+	EList<Observation> getObservations();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Observation} with the specified '<em><b>Name</b></em>' from the '<em><b>Observation</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Transition.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Transition.java
index 2d1be3a..86d6f39 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Transition.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Transition.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Transition.java,v 1.16 2006/10/10 20:41:28 khussey Exp $
+ * $Id: Transition.java,v 1.17 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -256,7 +256,7 @@
 	 * @model type="org.eclipse.uml2.uml.Trigger" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getTriggers();
+	EList<Trigger> getTriggers();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Trigger}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Trigger</b></em>' containment reference list.
@@ -330,7 +330,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateForkSegmentGuards(DiagnosticChain diagnostics, Map context);
+	boolean validateForkSegmentGuards(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -342,7 +343,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateJoinSegmentGuards(DiagnosticChain diagnostics, Map context);
+	boolean validateJoinSegmentGuards(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -354,7 +356,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateForkSegmentState(DiagnosticChain diagnostics, Map context);
+	boolean validateForkSegmentState(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -366,7 +369,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateJoinSegmentState(DiagnosticChain diagnostics, Map context);
+	boolean validateJoinSegmentState(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -381,7 +385,7 @@
 	 * @generated
 	 */
 	boolean validateOutgoingPseudostates(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -398,7 +402,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInitialTransition(DiagnosticChain diagnostics, Map context);
+	boolean validateInitialTransition(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -412,7 +417,7 @@
 	 * @generated
 	 */
 	boolean validateSignaturesCompatible(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TransitionKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TransitionKind.java
index 5259a3b..b4c821b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TransitionKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/TransitionKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TransitionKind.java,v 1.4 2006/06/07 21:39:13 khussey Exp $
+ * $Id: TransitionKind.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -32,8 +32,37 @@
  * @model
  * @generated
  */
-public final class TransitionKind
-		extends AbstractEnumerator {
+public enum TransitionKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Internal</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INTERNAL
+	 * @generated
+	 * @ordered
+	 */
+	INTERNAL_LITERAL(0, "internal", "internal"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Local</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LOCAL
+	 * @generated
+	 * @ordered
+	 */
+	LOCAL_LITERAL(1, "local", "local"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>External</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #EXTERNAL
+	 * @generated
+	 * @ordered
+	 */
+	EXTERNAL_LITERAL(2, "external", "external"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Internal</b></em>' literal value.
@@ -78,39 +107,6 @@
 	public static final int EXTERNAL = 2;
 
 	/**
-	 * The '<em><b>Internal</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #INTERNAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final TransitionKind INTERNAL_LITERAL = new TransitionKind(
-		INTERNAL, "internal", "internal"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Local</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final TransitionKind LOCAL_LITERAL = new TransitionKind(
-		LOCAL, "local", "local"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>External</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXTERNAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final TransitionKind EXTERNAL_LITERAL = new TransitionKind(
-		EXTERNAL, "external", "external"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Transition Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -125,8 +121,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<TransitionKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Transition Kind</b></em>' literal with the specified literal value.
@@ -179,13 +175,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private TransitionKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //TransitionKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Trigger.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Trigger.java
index 9ecec8d..8048b9f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Trigger.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Trigger.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Trigger.java,v 1.4 2006/05/12 20:38:03 khussey Exp $
+ * $Id: Trigger.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -77,7 +77,7 @@
 	 * @model type="org.eclipse.uml2.uml.Port" ordered="false"
 	 * @generated
 	 */
-	EList getPorts();
+	EList<Port> getPorts();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Port} with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>' from the '<em><b>Port</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Type.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Type.java
index 4ca35f8..ab37d60 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Type.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Type.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Type.java,v 1.8 2006/06/07 21:39:13 khussey Exp $
+ * $Id: Type.java,v 1.9 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -89,7 +89,7 @@
 	 * @model kind="operation" type="org.eclipse.uml2.uml.Association" ordered="false"
 	 * @generated
 	 */
-	EList getAssociations();
+	EList<Association> getAssociations();
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UMLPlugin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UMLPlugin.java
index 19e7cce..d5bbe28 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UMLPlugin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UMLPlugin.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLPlugin.java,v 1.1 2005/11/14 22:25:56 khussey Exp $
+ * $Id: UMLPlugin.java,v 1.2 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,6 +58,7 @@
 	 * @return the singleton instance.
 	 * @generated
 	 */
+	@Override
 	public ResourceLocator getPluginResourceLocator() {
 		return plugin;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UnmarshallAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UnmarshallAction.java
index 9d0f98b..cb72f3c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UnmarshallAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UnmarshallAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UnmarshallAction.java,v 1.8 2006/05/26 16:34:03 khussey Exp $
+ * $Id: UnmarshallAction.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -58,7 +58,7 @@
 	 * @model type="org.eclipse.uml2.uml.OutputPin" containment="true" resolveProxies="true" required="true" ordered="false"
 	 * @generated
 	 */
-	EList getResults();
+	EList<OutputPin> getResults();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.OutputPin}, with the specified '<em><b>Name</b></em>', and '<em><b>Type</b></em>', and appends it to the '<em><b>Result</b></em>' containment reference list.
@@ -197,7 +197,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -210,7 +211,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -222,7 +223,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNumberOfResult(DiagnosticChain diagnostics, Map context);
+	boolean validateNumberOfResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -234,7 +236,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateTypeAndOrdering(DiagnosticChain diagnostics, Map context);
+	boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -248,7 +251,7 @@
 	 * @generated
 	 */
 	boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -260,7 +263,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateStructuralFeature(DiagnosticChain diagnostics, Map context);
+	boolean validateStructuralFeature(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -273,6 +277,6 @@
 	 * @generated
 	 */
 	boolean validateUnmarshallTypeIsClassifier(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 } // UnmarshallAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UseCase.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UseCase.java
index aa53d22..2a1ad28 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UseCase.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/UseCase.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UseCase.java,v 1.7 2006/05/26 16:34:03 khussey Exp $
+ * $Id: UseCase.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -61,7 +61,7 @@
 	 * @model type="org.eclipse.uml2.uml.Include" opposite="includingCase" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getIncludes();
+	EList<Include> getIncludes();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Include}, with the specified '<em><b>Name</b></em>', and '<em><b>Addition</b></em>', and appends it to the '<em><b>Include</b></em>' containment reference list.
@@ -117,7 +117,7 @@
 	 * @model type="org.eclipse.uml2.uml.Extend" opposite="extension" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getExtends();
+	EList<Extend> getExtends();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.Extend}, with the specified '<em><b>Name</b></em>', and '<em><b>Extended Case</b></em>', and appends it to the '<em><b>Extend</b></em>' containment reference list.
@@ -173,7 +173,7 @@
 	 * @model type="org.eclipse.uml2.uml.ExtensionPoint" opposite="useCase" containment="true" resolveProxies="true" ordered="false"
 	 * @generated
 	 */
-	EList getExtensionPoints();
+	EList<ExtensionPoint> getExtensionPoints();
 
 	/**
 	 * Creates a new {@link org.eclipse.uml2.uml.ExtensionPoint}, with the specified '<em><b>Name</b></em>', and appends it to the '<em><b>Extension Point</b></em>' containment reference list.
@@ -226,7 +226,7 @@
 	 * @model type="org.eclipse.uml2.uml.Classifier" opposite="useCase" ordered="false"
 	 * @generated
 	 */
-	EList getSubjects();
+	EList<Classifier> getSubjects();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Classifier} with the specified '<em><b>Name</b></em>' from the '<em><b>Subject</b></em>' reference list.
@@ -262,7 +262,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMustHaveName(DiagnosticChain diagnostics, Map context);
+	boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -274,7 +275,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateBinaryAssociations(DiagnosticChain diagnostics, Map context);
+	boolean validateBinaryAssociations(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -287,7 +289,7 @@
 	 * @generated
 	 */
 	boolean validateNoAssociationToUseCase(DiagnosticChain diagnostics,
-			Map context);
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -299,7 +301,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCannotIncludeSelf(DiagnosticChain diagnostics, Map context);
+	boolean validateCannotIncludeSelf(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -311,6 +314,6 @@
 	 * @model type="org.eclipse.uml2.uml.UseCase" ordered="false"
 	 * @generated
 	 */
-	EList allIncludedUseCases();
+	EList<UseCase> allIncludedUseCases();
 
 } // UseCase
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValuePin.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValuePin.java
index c960ebf..286e891 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValuePin.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValuePin.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValuePin.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ValuePin.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -89,7 +89,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCompatibleType(DiagnosticChain diagnostics, Map context);
+	boolean validateCompatibleType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -101,6 +102,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateNoIncomingEdges(DiagnosticChain diagnostics, Map context);
+	boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ValuePin
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValueSpecificationAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValueSpecificationAction.java
index ce04202..0dc8f8e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValueSpecificationAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/ValueSpecificationAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValueSpecificationAction.java,v 1.6 2006/05/26 16:34:03 khussey Exp $
+ * $Id: ValueSpecificationAction.java,v 1.7 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -127,7 +127,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateCompatibleType(DiagnosticChain diagnostics, Map context);
+	boolean validateCompatibleType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -139,6 +140,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // ValueSpecificationAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Variable.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Variable.java
index 66d2548..b45cd7b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Variable.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Variable.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Variable.java,v 1.8 2006/05/12 20:38:06 khussey Exp $
+ * $Id: Variable.java,v 1.9 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -105,7 +105,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateOwned(DiagnosticChain diagnostics, Map context);
+	boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VariableAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VariableAction.java
index 331e9c1..c69f6a2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VariableAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VariableAction.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VariableAction.java,v 1.1 2005/11/14 22:26:00 khussey Exp $
+ * $Id: VariableAction.java,v 1.2 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -74,6 +74,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateScopeOfVariable(DiagnosticChain diagnostics, Map context);
+	boolean validateScopeOfVariable(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // VariableAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Vertex.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Vertex.java
index 8500bd8..2b06d88 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Vertex.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/Vertex.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: Vertex.java,v 1.7 2006/05/12 20:38:05 khussey Exp $
+ * $Id: Vertex.java,v 1.8 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -56,7 +56,7 @@
 	 * @model type="org.eclipse.uml2.uml.Transition" opposite="source" ordered="false"
 	 * @generated
 	 */
-	EList getOutgoings();
+	EList<Transition> getOutgoings();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Transition} with the specified '<em><b>Name</b></em>' from the '<em><b>Outgoing</b></em>' reference list.
@@ -97,7 +97,7 @@
 	 * @model type="org.eclipse.uml2.uml.Transition" opposite="target" ordered="false"
 	 * @generated
 	 */
-	EList getIncomings();
+	EList<Transition> getIncomings();
 
 	/**
 	 * Retrieves the first {@link org.eclipse.uml2.uml.Transition} with the specified '<em><b>Name</b></em>' from the '<em><b>Incoming</b></em>' reference list.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VisibilityKind.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VisibilityKind.java
index 9c8543b..fa4bc28 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VisibilityKind.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/VisibilityKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * Copyright (c) 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VisibilityKind.java,v 1.3 2006/05/12 20:38:07 khussey Exp $
+ * $Id: VisibilityKind.java,v 1.4 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -16,7 +16,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.common.util.AbstractEnumerator;
+import org.eclipse.emf.common.util.Enumerator;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,8 +30,47 @@
  * @model
  * @generated
  */
-public final class VisibilityKind
-		extends AbstractEnumerator {
+public enum VisibilityKind
+		implements Enumerator {
+	/**
+	 * The '<em><b>Public</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PUBLIC
+	 * @generated
+	 * @ordered
+	 */
+	PUBLIC_LITERAL(0, "public", "public"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Private</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PRIVATE
+	 * @generated
+	 * @ordered
+	 */
+	PRIVATE_LITERAL(1, "private", "private"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Protected</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PROTECTED
+	 * @generated
+	 * @ordered
+	 */
+	PROTECTED_LITERAL(2, "protected", "protected"), //$NON-NLS-1$ //$NON-NLS-2$
+
+	/**
+	 * The '<em><b>Package</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PACKAGE
+	 * @generated
+	 * @ordered
+	 */
+	PACKAGE_LITERAL(3, "package", "package"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>Public</b></em>' literal value.
@@ -90,50 +129,6 @@
 	public static final int PACKAGE = 3;
 
 	/**
-	 * The '<em><b>Public</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PUBLIC
-	 * @generated
-	 * @ordered
-	 */
-	public static final VisibilityKind PUBLIC_LITERAL = new VisibilityKind(
-		PUBLIC, "public", "public"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Private</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PRIVATE
-	 * @generated
-	 * @ordered
-	 */
-	public static final VisibilityKind PRIVATE_LITERAL = new VisibilityKind(
-		PRIVATE, "private", "private"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Protected</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PROTECTED
-	 * @generated
-	 * @ordered
-	 */
-	public static final VisibilityKind PROTECTED_LITERAL = new VisibilityKind(
-		PROTECTED, "protected", "protected"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Package</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #PACKAGE
-	 * @generated
-	 * @ordered
-	 */
-	public static final VisibilityKind PACKAGE_LITERAL = new VisibilityKind(
-		PACKAGE, "package", "package"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
 	 * An array of all the '<em><b>Visibility Kind</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -148,8 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-		.asList(VALUES_ARRAY));
+	public static final List<VisibilityKind> VALUES = Collections
+		.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
 	 * Returns the '<em><b>Visibility Kind</b></em>' literal with the specified literal value.
@@ -204,13 +199,74 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
 	 * Only this class can construct instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	private VisibilityKind(int value, String name, String literal) {
-		super(value, name, literal);
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+		return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
 	}
 
 } //VisibilityKind
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteLinkAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteLinkAction.java
index fc14e45..e952622 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteLinkAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteLinkAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteLinkAction.java,v 1.2 2006/05/12 20:38:08 khussey Exp $
+ * $Id: WriteLinkAction.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -43,6 +43,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateAllowAccess(DiagnosticChain diagnostics, Map context);
+	boolean validateAllowAccess(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // WriteLinkAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteStructuralFeatureAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteStructuralFeatureAction.java
index 1491798..186b556 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteStructuralFeatureAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteStructuralFeatureAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteStructuralFeatureAction.java,v 1.5 2006/05/26 16:34:03 khussey Exp $
+ * $Id: WriteStructuralFeatureAction.java,v 1.6 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -101,6 +101,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateInputPin(DiagnosticChain diagnostics, Map context);
+	boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // WriteStructuralFeatureAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteVariableAction.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteVariableAction.java
index 723e2da..ca4c363 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteVariableAction.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/WriteVariableAction.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteVariableAction.java,v 1.5 2006/05/26 16:34:02 khussey Exp $
+ * $Id: WriteVariableAction.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml;
 
@@ -101,7 +101,8 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateSameType(DiagnosticChain diagnostics, Map context);
+	boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -113,6 +114,7 @@
 	 * @model
 	 * @generated
 	 */
-	boolean validateMultiplicity(DiagnosticChain diagnostics, Map context);
+	boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context);
 
 } // WriteVariableAction
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AbstractionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AbstractionImpl.java
index 5b24693..59d392c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AbstractionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AbstractionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AbstractionImpl.java,v 1.18 2006/11/14 18:02:18 khussey Exp $
+ * $Id: AbstractionImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,7 +32,10 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Abstraction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.OpaqueExpression;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -81,6 +85,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ABSTRACTION;
 	}
@@ -90,23 +95,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ABSTRACTION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ABSTRACTION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ABSTRACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -215,18 +222,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
@@ -234,7 +242,7 @@
 			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ABSTRACTION__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ABSTRACTION__MAPPING :
 				return basicSetMapping(null, msgs);
@@ -247,6 +255,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ABSTRACTION__EANNOTATIONS :
@@ -306,15 +315,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ABSTRACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ABSTRACTION__NAME :
 				setName((String) newValue);
@@ -324,7 +337,8 @@
 				return;
 			case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -337,11 +351,13 @@
 				return;
 			case UMLPackage.ABSTRACTION__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.ABSTRACTION__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.ABSTRACTION__MAPPING :
 				setMapping((OpaqueExpression) newValue);
@@ -355,6 +371,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ABSTRACTION__EANNOTATIONS :
@@ -399,6 +416,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ABSTRACTION__EANNOTATIONS :
@@ -462,6 +480,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.ABSTRACTION__MAPPING);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptCallActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptCallActionImpl.java
index 7d8093f..6a8f407 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptCallActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptCallActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptCallActionImpl.java,v 1.17 2006/11/14 18:02:16 khussey Exp $
+ * $Id: AcceptCallActionImpl.java,v 1.18 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -23,6 +23,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,9 +38,18 @@
 
 import org.eclipse.uml2.uml.AcceptCallAction;
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -88,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACCEPT_CALL_ACTION;
 	}
@@ -97,22 +108,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.ACCEPT_CALL_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache
+					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+						outputs = new DerivedUnionEObjectEList<OutputPin>(
+							OutputPin.class, this,
+							UMLPackage.ACCEPT_CALL_ACTION__OUTPUT,
+							OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.ACCEPT_CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -231,7 +245,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateResultPins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateResultPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return AcceptCallActionOperations.validateResultPins(this, diagnostics,
 			context);
 	}
@@ -242,7 +257,7 @@
 	 * @generated
 	 */
 	public boolean validateTriggerCallEvent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AcceptCallActionOperations.validateTriggerCallEvent(this,
 			diagnostics, context);
 	}
@@ -252,7 +267,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUnmarshall(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUnmarshall(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return AcceptCallActionOperations.validateUnmarshall(this, diagnostics,
 			context);
 	}
@@ -262,18 +278,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
@@ -281,31 +298,31 @@
 			case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				return ((InternalEList) getTriggers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
 				return basicSetReturnInformation(null, msgs);
@@ -318,6 +335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
@@ -409,15 +427,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__NAME :
 				setName((String) newValue);
@@ -427,7 +449,8 @@
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -443,46 +466,55 @@
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL :
 				setIsUnmarshall(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
 				getTriggers().clear();
-				getTriggers().addAll((Collection) newValue);
+				getTriggers().addAll((Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
 				setReturnInformation((OutputPin) newValue);
@@ -496,6 +528,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
@@ -570,6 +603,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
@@ -661,6 +695,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptEventActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptEventActionImpl.java
index 855bd90..4cb79d6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptEventActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AcceptEventActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptEventActionImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: AcceptEventActionImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -38,6 +38,14 @@
 
 import org.eclipse.uml2.uml.AcceptEventAction;
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -96,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList results = null;
+	protected EList<OutputPin> results = null;
 
 	/**
 	 * The cached value of the '{@link #getTriggers() <em>Trigger</em>}' containment reference list.
@@ -106,7 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList triggers = null;
+	protected EList<Trigger> triggers = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -122,6 +130,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACCEPT_EVENT_ACTION;
 	}
@@ -131,22 +140,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache
+					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+						outputs = new DerivedUnionEObjectEList<OutputPin>(
+							OutputPin.class, this,
+							UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT,
+							OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -183,10 +195,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getResults() {
+	public EList<OutputPin> getResults() {
 		if (results == null) {
-			results = new EObjectContainmentEList.Resolving(OutputPin.class,
-				this, UMLPackage.ACCEPT_EVENT_ACTION__RESULT);
+			results = new EObjectContainmentEList.Resolving<OutputPin>(
+				OutputPin.class, this, UMLPackage.ACCEPT_EVENT_ACTION__RESULT);
 		}
 		return results;
 	}
@@ -222,8 +234,7 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (Iterator i = getResults().iterator(); i.hasNext();) {
-			OutputPin result = (OutputPin) i.next();
+		resultLoop : for (OutputPin result : getResults()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(result.getName())
 				: name.equals(result.getName())))
@@ -251,10 +262,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTriggers() {
+	public EList<Trigger> getTriggers() {
 		if (triggers == null) {
-			triggers = new EObjectContainmentEList.Resolving(Trigger.class,
-				this, UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER);
+			triggers = new EObjectContainmentEList.Resolving<Trigger>(
+				Trigger.class, this, UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER);
 		}
 		return triggers;
 	}
@@ -288,8 +299,7 @@
 	 */
 	public Trigger getTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		triggerLoop : for (Iterator i = getTriggers().iterator(); i.hasNext();) {
-			Trigger trigger = (Trigger) i.next();
+		triggerLoop : for (Trigger trigger : getTriggers()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(trigger.getName())
 				: name.equals(trigger.getName())))
@@ -306,7 +316,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoInputPins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoInputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return AcceptEventActionOperations.validateNoInputPins(this,
 			diagnostics, context);
 	}
@@ -316,7 +327,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoOutputPins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoOutputPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return AcceptEventActionOperations.validateNoOutputPins(this,
 			diagnostics, context);
 	}
@@ -327,7 +339,7 @@
 	 * @generated
 	 */
 	public boolean validateTriggerEvents(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AcceptEventActionOperations.validateTriggerEvents(this,
 			diagnostics, context);
 	}
@@ -338,7 +350,7 @@
 	 * @generated
 	 */
 	public boolean validateUnmarshallSignalEvents(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AcceptEventActionOperations.validateUnmarshallSignalEvents(this,
 			diagnostics, context);
 	}
@@ -348,18 +360,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
@@ -367,31 +380,31 @@
 			case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				return ((InternalEList) getTriggers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -402,6 +415,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
@@ -489,15 +503,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__NAME :
 				setName((String) newValue);
@@ -507,7 +525,8 @@
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -523,46 +542,55 @@
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL :
 				setIsUnmarshall(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
 				getTriggers().clear();
-				getTriggers().addAll((Collection) newValue);
+				getTriggers().addAll((Collection<? extends Trigger>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -573,6 +601,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
@@ -644,6 +673,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
@@ -721,6 +751,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -747,6 +778,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.ACCEPT_EVENT_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionExecutionSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionExecutionSpecificationImpl.java
index cfc0288..112f3d3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionExecutionSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionExecutionSpecificationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionExecutionSpecificationImpl.java,v 1.13 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ActionExecutionSpecificationImpl.java,v 1.14 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,6 +19,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -26,8 +27,12 @@
 
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.ActionExecutionSpecification;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.OccurrenceSpecification;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -76,6 +81,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION;
 	}
@@ -130,7 +136,7 @@
 	 * @generated
 	 */
 	public boolean validateActionReferenced(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActionExecutionSpecificationOperations.validateActionReferenced(
 			this, diagnostics, context);
 	}
@@ -140,6 +146,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -201,15 +208,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -219,18 +230,20 @@
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -256,6 +269,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -306,6 +320,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionImpl.java
index f7748df..a5799ef 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionImpl.java
@@ -8,17 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionImpl.java,v 1.25 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ActionImpl.java,v 1.26 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
-
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,11 +31,18 @@
 
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -74,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList localPreconditions = null;
+	protected EList<Constraint> localPreconditions = null;
 
 	/**
 	 * The cached value of the '{@link #getLocalPostconditions() <em>Local Postcondition</em>}' containment reference list.
@@ -84,7 +90,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList localPostconditions = null;
+	protected EList<Constraint> localPostconditions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -100,6 +106,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTION;
 	}
@@ -109,21 +116,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.ACTION__OUTPUT, null));
+				cache
+					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+						outputs = new DerivedUnionEObjectEList<OutputPin>(
+							OutputPin.class, this, UMLPackage.ACTION__OUTPUT,
+							null));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.ACTION__OUTPUT, null);
 	}
 
@@ -142,8 +152,7 @@
 	 * @generated
 	 */
 	public OutputPin getOutput(String name, Type type, boolean ignoreCase) {
-		outputLoop : for (Iterator i = getOutputs().iterator(); i.hasNext();) {
-			OutputPin output = (OutputPin) i.next();
+		outputLoop : for (OutputPin output : getOutputs()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(output.getName())
 				: name.equals(output.getName())))
@@ -174,23 +183,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.ACTION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -199,21 +209,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.ACTION__INPUT, null));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.ACTION__INPUT, null));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.ACTION__INPUT, null);
 	}
 
@@ -233,8 +244,7 @@
 	 */
 	public InputPin getInput(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		inputLoop : for (Iterator i = getInputs().iterator(); i.hasNext();) {
-			InputPin input = (InputPin) i.next();
+		inputLoop : for (InputPin input : getInputs()) {
 			if (eClass != null && !eClass.isInstance(input))
 				continue inputLoop;
 			if (name != null && !(ignoreCase
@@ -277,9 +287,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLocalPreconditions() {
+	public EList<Constraint> getLocalPreconditions() {
 		if (localPreconditions == null) {
-			localPreconditions = new EObjectContainmentEList.Resolving(
+			localPreconditions = new EObjectContainmentEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.ACTION__LOCAL_PRECONDITION);
 		}
 		return localPreconditions;
@@ -323,9 +333,7 @@
 	 */
 	public Constraint getLocalPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		localPreconditionLoop : for (Iterator i = getLocalPreconditions()
-			.iterator(); i.hasNext();) {
-			Constraint localPrecondition = (Constraint) i.next();
+		localPreconditionLoop : for (Constraint localPrecondition : getLocalPreconditions()) {
 			if (eClass != null && !eClass.isInstance(localPrecondition))
 				continue localPreconditionLoop;
 			if (name != null && !(ignoreCase
@@ -344,9 +352,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLocalPostconditions() {
+	public EList<Constraint> getLocalPostconditions() {
 		if (localPostconditions == null) {
-			localPostconditions = new EObjectContainmentEList.Resolving(
+			localPostconditions = new EObjectContainmentEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.ACTION__LOCAL_POSTCONDITION);
 		}
 		return localPostconditions;
@@ -390,9 +398,7 @@
 	 */
 	public Constraint getLocalPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		localPostconditionLoop : for (Iterator i = getLocalPostconditions()
-			.iterator(); i.hasNext();) {
-			Constraint localPostcondition = (Constraint) i.next();
+		localPostconditionLoop : for (Constraint localPostcondition : getLocalPostconditions()) {
 			if (eClass != null && !eClass.isInstance(localPostcondition))
 				continue localPostconditionLoop;
 			if (name != null && !(ignoreCase
@@ -411,18 +417,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
@@ -430,26 +437,26 @@
 			case UMLPackage.ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -459,6 +466,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTION__EANNOTATIONS :
@@ -538,15 +546,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTION__NAME :
 				setName((String) newValue);
@@ -556,7 +568,8 @@
 				return;
 			case UMLPackage.ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -572,35 +585,44 @@
 				return;
 			case UMLPackage.ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -611,6 +633,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION__EANNOTATIONS :
@@ -673,6 +696,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION__EANNOTATIONS :
@@ -753,6 +777,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || isSetOutputs() || isSetInputs()
 			|| eIsSet(UMLPackage.ACTION__LOCAL_PRECONDITION)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionInputPinImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionInputPinImpl.java
index 8bb3808..f1e0f30 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionInputPinImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActionInputPinImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionInputPinImpl.java,v 1.25 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ActionInputPinImpl.java,v 1.26 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,9 +38,16 @@
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.ActionInputPin;
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
+import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -91,6 +99,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTION_INPUT_PIN;
 	}
@@ -100,23 +109,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -227,7 +238,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOneOutputPin(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOneOutputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActionInputPinOperations.validateOneOutputPin(this, diagnostics,
 			context);
 	}
@@ -237,7 +249,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInputPin(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActionInputPinOperations.validateInputPin(this, diagnostics,
 			context);
 	}
@@ -248,7 +261,7 @@
 	 * @generated
 	 */
 	public boolean validateNoControlOrDataFlow(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActionInputPinOperations.validateNoControlOrDataFlow(this,
 			diagnostics, context);
 	}
@@ -258,18 +271,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
@@ -277,16 +291,16 @@
 			case UMLPackage.ACTION_INPUT_PIN__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
 				return basicSetUpperBound(null, msgs);
@@ -305,6 +319,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
@@ -418,15 +433,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__NAME :
 				setName((String) newValue);
@@ -436,7 +455,8 @@
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -452,23 +472,29 @@
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__TYPE :
 				setType((Type) newValue);
@@ -484,7 +510,7 @@
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.ACTION_INPUT_PIN__SELECTION :
 				setSelection((Behavior) newValue);
@@ -522,6 +548,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
@@ -617,6 +644,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
@@ -718,6 +746,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityEdgeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityEdgeImpl.java
index bc8a75c..953cf43 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityEdgeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityEdgeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityEdgeImpl.java,v 1.22 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ActivityEdgeImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -43,6 +43,8 @@
 import org.eclipse.uml2.uml.ActivityGroup;
 import org.eclipse.uml2.uml.ActivityNode;
 import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.RedefinableElement;
@@ -112,7 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedEdges = null;
+	protected EList<ActivityEdge> redefinedEdges = null;
 
 	/**
 	 * The cached value of the '{@link #getInPartitions() <em>In Partition</em>}' reference list.
@@ -122,7 +124,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inPartitions = null;
+	protected EList<ActivityPartition> inPartitions = null;
 
 	/**
 	 * The cached value of the '{@link #getGuard() <em>Guard</em>}' containment reference.
@@ -168,6 +170,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_EDGE;
 	}
@@ -177,24 +180,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInGroups() {
+	public EList<ActivityGroup> getInGroups() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inGroups = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_EDGE__IN_GROUP);
+			@SuppressWarnings("unchecked")
+			EList<ActivityGroup> inGroups = (EList<ActivityGroup>) cache.get(
+				eResource, this, UMLPackage.Literals.ACTIVITY_EDGE__IN_GROUP);
 			if (inGroups == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ACTIVITY_EDGE__IN_GROUP,
-					inGroups = new DerivedUnionEObjectEList(
+					inGroups = new DerivedUnionEObjectEList<ActivityGroup>(
 						ActivityGroup.class, this,
 						UMLPackage.ACTIVITY_EDGE__IN_GROUP, IN_GROUP_ESUBSETS));
 			}
 			return inGroups;
 		}
-		return new DerivedUnionEObjectEList(ActivityGroup.class, this,
-			UMLPackage.ACTIVITY_EDGE__IN_GROUP, IN_GROUP_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
+			this, UMLPackage.ACTIVITY_EDGE__IN_GROUP, IN_GROUP_ESUBSETS);
 	}
 
 	/**
@@ -202,24 +206,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -229,23 +239,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -316,9 +328,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInPartitions() {
+	public EList<ActivityPartition> getInPartitions() {
 		if (inPartitions == null) {
-			inPartitions = new EObjectWithInverseResolvingEList.ManyInverse(
+			inPartitions = new EObjectWithInverseResolvingEList.ManyInverse<ActivityPartition>(
 				ActivityPartition.class, this,
 				UMLPackage.ACTIVITY_EDGE__IN_PARTITION,
 				UMLPackage.ACTIVITY_PARTITION__EDGE);
@@ -341,9 +353,7 @@
 	 * @generated
 	 */
 	public ActivityPartition getInPartition(String name, boolean ignoreCase) {
-		inPartitionLoop : for (Iterator i = getInPartitions().iterator(); i
-			.hasNext();) {
-			ActivityPartition inPartition = (ActivityPartition) i.next();
+		inPartitionLoop : for (ActivityPartition inPartition : getInPartitions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(inPartition.getName())
 				: name.equals(inPartition.getName())))
@@ -497,10 +507,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedEdges() {
+	public EList<ActivityEdge> getRedefinedEdges() {
 		if (redefinedEdges == null) {
-			redefinedEdges = new EObjectResolvingEList(ActivityEdge.class,
-				this, UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE);
+			redefinedEdges = new EObjectResolvingEList<ActivityEdge>(
+				ActivityEdge.class, this,
+				UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE);
 		}
 		return redefinedEdges;
 	}
@@ -521,9 +532,7 @@
 	 */
 	public ActivityEdge getRedefinedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedEdgeLoop : for (Iterator i = getRedefinedEdges().iterator(); i
-			.hasNext();) {
-			ActivityEdge redefinedEdge = (ActivityEdge) i.next();
+		redefinedEdgeLoop : for (ActivityEdge redefinedEdge : getRedefinedEdges()) {
 			if (eClass != null && !eClass.isInstance(redefinedEdge))
 				continue redefinedEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -897,7 +906,7 @@
 	 * @generated
 	 */
 	public boolean validateSourceAndTarget(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityEdgeOperations.validateSourceAndTarget(this,
 			diagnostics, context);
 	}
@@ -907,7 +916,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityEdgeOperations.validateOwned(this, diagnostics, context);
 	}
 
@@ -917,7 +927,7 @@
 	 * @generated
 	 */
 	public boolean validateStructuredNode(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityEdgeOperations.validateStructuredNode(this, diagnostics,
 			context);
 	}
@@ -927,15 +937,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__SOURCE :
 				if (source != null)
 					msgs = ((InternalEObject) source).eInverseRemove(this,
@@ -949,8 +961,8 @@
 						msgs);
 				return basicSetTarget((ActivityNode) otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
 				if (interrupts != null)
 					msgs = ((InternalEObject) interrupts)
@@ -978,18 +990,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTIVITY_EDGE__SOURCE :
@@ -997,7 +1010,7 @@
 			case UMLPackage.ACTIVITY_EDGE__TARGET :
 				return basicSetTarget(null, msgs);
 			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_EDGE__GUARD :
 				return basicSetGuard(null, msgs);
@@ -1018,6 +1031,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -1037,6 +1051,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
@@ -1116,15 +1131,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_EDGE__NAME :
 				setName((String) newValue);
@@ -1134,7 +1153,8 @@
 				return;
 			case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -1150,11 +1170,13 @@
 				return;
 			case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE :
 				getRedefinedEdges().clear();
-				getRedefinedEdges().addAll((Collection) newValue);
+				getRedefinedEdges().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_EDGE__GUARD :
 				setGuard((ValueSpecification) newValue);
@@ -1180,6 +1202,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
@@ -1239,6 +1262,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
@@ -1323,6 +1347,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || eIsSet(UMLPackage.ACTIVITY_EDGE__ACTIVITY);
 	}
@@ -1342,6 +1367,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE);
@@ -1389,6 +1415,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.ACTIVITY_EDGE__GUARD)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityFinalNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityFinalNodeImpl.java
index 9e65ed9..f9a1021 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityFinalNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityFinalNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityFinalNodeImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: ActivityFinalNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_FINAL_NODE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityGroupImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityGroupImpl.java
index 5ba328c..a8d8bdf 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityGroupImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityGroupImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityGroupImpl.java,v 1.17 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ActivityGroupImpl.java,v 1.18 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -40,6 +40,7 @@
 import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.ActivityGroup;
 import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.UMLPackage;
 
@@ -82,6 +83,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_GROUP;
 	}
@@ -91,24 +93,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubgroups() {
+	public EList<ActivityGroup> getSubgroups() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList subgroups = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			@SuppressWarnings("unchecked")
+			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
+				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
 			if (subgroups == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP,
-					subgroups = new DerivedUnionEObjectEList(
+					subgroups = new DerivedUnionEObjectEList<ActivityGroup>(
 						ActivityGroup.class, this,
 						UMLPackage.ACTIVITY_GROUP__SUBGROUP, null));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList(ActivityGroup.class, this,
-			UMLPackage.ACTIVITY_GROUP__SUBGROUP, null);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
+			this, UMLPackage.ACTIVITY_GROUP__SUBGROUP, null);
 	}
 
 	/**
@@ -116,23 +119,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -141,24 +146,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedNodes() {
+	public EList<ActivityNode> getContainedNodes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedNodes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
 			if (containedNodes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
-					containedNodes = new DerivedUnionEObjectEList(
-						ActivityNode.class, this,
-						UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
+						containedNodes = new DerivedUnionEObjectEList<ActivityNode>(
+							ActivityNode.class, this,
+							UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null));
 			}
 			return containedNodes;
 		}
-		return new DerivedUnionEObjectEList(ActivityNode.class, this,
-			UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null);
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class,
+			this, UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null);
 	}
 
 	/**
@@ -177,9 +187,7 @@
 	 */
 	public ActivityNode getContainedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedNodeLoop : for (Iterator i = getContainedNodes().iterator(); i
-			.hasNext();) {
-			ActivityNode containedNode = (ActivityNode) i.next();
+		containedNodeLoop : for (ActivityNode containedNode : getContainedNodes()) {
 			if (eClass != null && !eClass.isInstance(containedNode))
 				continue containedNodeLoop;
 			if (name != null && !(ignoreCase
@@ -196,24 +204,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedEdges() {
+	public EList<ActivityEdge> getContainedEdges() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedEdges = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
 			if (containedEdges == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
-					containedEdges = new DerivedUnionEObjectEList(
-						ActivityEdge.class, this,
-						UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
+						containedEdges = new DerivedUnionEObjectEList<ActivityEdge>(
+							ActivityEdge.class, this,
+							UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null));
 			}
 			return containedEdges;
 		}
-		return new DerivedUnionEObjectEList(ActivityEdge.class, this,
-			UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null);
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class,
+			this, UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null);
 	}
 
 	/**
@@ -232,9 +245,7 @@
 	 */
 	public ActivityEdge getContainedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedEdgeLoop : for (Iterator i = getContainedEdges().iterator(); i
-			.hasNext();) {
-			ActivityEdge containedEdge = (ActivityEdge) i.next();
+		containedEdgeLoop : for (ActivityEdge containedEdge : getContainedEdges()) {
 			if (eClass != null && !eClass.isInstance(containedEdge))
 				continue containedEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -315,7 +326,7 @@
 	 * @generated
 	 */
 	public boolean validateNodesAndEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics,
 			context);
 	}
@@ -325,7 +336,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotContained(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNotContained(this, diagnostics,
 			context);
 	}
@@ -335,7 +347,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGroupOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGroupOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateGroupOwned(this, diagnostics,
 			context);
 	}
@@ -345,12 +358,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -364,14 +379,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
@@ -384,6 +400,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -399,6 +416,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
@@ -434,15 +452,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
@@ -456,6 +478,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
@@ -476,6 +499,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
@@ -526,6 +550,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || isSetSubgroups();
 	}
@@ -595,6 +620,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || isSetSuperGroup()
 			|| eIsSet(UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityImpl.java
index 9acae59..899ea43 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityImpl.java,v 1.29 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ActivityImpl.java,v 1.30 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -46,15 +46,35 @@
 import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -94,7 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nodes = null;
+	protected EList<ActivityNode> nodes = null;
 
 	/**
 	 * The cached value of the '{@link #getGroups() <em>Group</em>}' containment reference list.
@@ -104,7 +124,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList groups = null;
+	protected EList<ActivityGroup> groups = null;
 
 	/**
 	 * The cached value of the '{@link #getVariables() <em>Variable</em>}' containment reference list.
@@ -114,7 +134,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList variables = null;
+	protected EList<Variable> variables = null;
 
 	/**
 	 * The default value of the '{@link #isReadOnly() <em>Is Read Only</em>}' attribute.
@@ -144,7 +164,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList edges = null;
+	protected EList<ActivityEdge> edges = null;
 
 	/**
 	 * The cached value of the '{@link #getPartitions() <em>Partition</em>}' reference list.
@@ -154,7 +174,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList partitions = null;
+	protected EList<ActivityPartition> partitions = null;
 
 	/**
 	 * The default value of the '{@link #isSingleExecution() <em>Is Single Execution</em>}' attribute.
@@ -190,6 +210,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY;
 	}
@@ -199,23 +220,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTIVITY__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ACTIVITY__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTIVITY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -224,25 +247,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.ACTIVITY__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ACTIVITY__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ACTIVITY__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -250,9 +274,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGroups() {
+	public EList<ActivityGroup> getGroups() {
 		if (groups == null) {
-			groups = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			groups = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<ActivityGroup>(
 				ActivityGroup.class, this, UMLPackage.ACTIVITY__GROUP, null,
 				GROUP_ESUBSETS, UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY);
 		}
@@ -275,9 +299,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNodes() {
+	public EList<ActivityNode> getNodes() {
 		if (nodes == null) {
-			nodes = new EObjectContainmentWithInverseEList.Resolving(
+			nodes = new EObjectContainmentWithInverseEList.Resolving<ActivityNode>(
 				ActivityNode.class, this, UMLPackage.ACTIVITY__NODE,
 				UMLPackage.ACTIVITY_NODE__ACTIVITY);
 		}
@@ -313,8 +337,7 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		nodeLoop : for (Iterator i = getNodes().iterator(); i.hasNext();) {
-			ActivityNode node = (ActivityNode) i.next();
+		nodeLoop : for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
 			if (name != null && !(ignoreCase
@@ -388,23 +411,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getStructuredNodes() {
+	public EList<StructuredActivityNode> getStructuredNodes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList structuredNodes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE);
+			@SuppressWarnings("unchecked")
+			EList<StructuredActivityNode> structuredNodes = (EList<StructuredActivityNode>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE);
 			if (structuredNodes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE,
-					structuredNodes = new DerivedEObjectEList(
-						StructuredActivityNode.class, this,
-						UMLPackage.ACTIVITY__STRUCTURED_NODE,
-						STRUCTURED_NODE_ESUPERSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE,
+						structuredNodes = new DerivedEObjectEList<StructuredActivityNode>(
+							StructuredActivityNode.class, this,
+							UMLPackage.ACTIVITY__STRUCTURED_NODE,
+							STRUCTURED_NODE_ESUPERSETS));
 			}
 			return structuredNodes;
 		}
-		return new DerivedEObjectEList(StructuredActivityNode.class, this,
+		return new DerivedEObjectEList<StructuredActivityNode>(
+			StructuredActivityNode.class, this,
 			UMLPackage.ACTIVITY__STRUCTURED_NODE, STRUCTURED_NODE_ESUPERSETS);
 	}
 
@@ -424,10 +453,7 @@
 	 */
 	public StructuredActivityNode getStructuredNode(String name,
 			boolean ignoreCase, EClass eClass) {
-		structuredNodeLoop : for (Iterator i = getStructuredNodes().iterator(); i
-			.hasNext();) {
-			StructuredActivityNode structuredNode = (StructuredActivityNode) i
-				.next();
+		structuredNodeLoop : for (StructuredActivityNode structuredNode : getStructuredNodes()) {
 			if (eClass != null && !eClass.isInstance(structuredNode))
 				continue structuredNodeLoop;
 			if (name != null && !(ignoreCase
@@ -444,9 +470,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getVariables() {
+	public EList<Variable> getVariables() {
 		if (variables == null) {
-			variables = new EObjectContainmentWithInverseEList.Resolving(
+			variables = new EObjectContainmentWithInverseEList.Resolving<Variable>(
 				Variable.class, this, UMLPackage.ACTIVITY__VARIABLE,
 				UMLPackage.VARIABLE__ACTIVITY_SCOPE);
 		}
@@ -484,8 +510,7 @@
 	 */
 	public Variable getVariable(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		variableLoop : for (Iterator i = getVariables().iterator(); i.hasNext();) {
-			Variable variable = (Variable) i.next();
+		variableLoop : for (Variable variable : getVariables()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(variable.getName())
 				: name.equals(variable.getName())))
@@ -504,9 +529,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEdges() {
+	public EList<ActivityEdge> getEdges() {
 		if (edges == null) {
-			edges = new EObjectContainmentWithInverseEList.Resolving(
+			edges = new EObjectContainmentWithInverseEList.Resolving<ActivityEdge>(
 				ActivityEdge.class, this, UMLPackage.ACTIVITY__EDGE,
 				UMLPackage.ACTIVITY_EDGE__ACTIVITY);
 		}
@@ -542,8 +567,7 @@
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		edgeLoop : for (Iterator i = getEdges().iterator(); i.hasNext();) {
-			ActivityEdge edge = (ActivityEdge) i.next();
+		edgeLoop : for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
 			if (name != null && !(ignoreCase
@@ -562,9 +586,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPartitions() {
+	public EList<ActivityPartition> getPartitions() {
 		if (partitions == null) {
-			partitions = new SubsetSupersetEObjectResolvingEList(
+			partitions = new SubsetSupersetEObjectResolvingEList<ActivityPartition>(
 				ActivityPartition.class, this, UMLPackage.ACTIVITY__PARTITION,
 				PARTITION_ESUPERSETS, null);
 		}
@@ -600,9 +624,7 @@
 	 */
 	public ActivityPartition getPartition(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		partitionLoop : for (Iterator i = getPartitions().iterator(); i
-			.hasNext();) {
-			ActivityPartition partition = (ActivityPartition) i.next();
+		partitionLoop : for (ActivityPartition partition : getPartitions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(partition.getName())
 				: name.equals(partition.getName())))
@@ -620,7 +642,7 @@
 	 * @generated
 	 */
 	public boolean validateNoSupergroups(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityOperations.validateNoSupergroups(this, diagnostics,
 			context);
 	}
@@ -631,7 +653,7 @@
 	 * @generated
 	 */
 	public boolean validateActivityParameterNode(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityOperations.validateActivityParameterNode(this,
 			diagnostics, context);
 	}
@@ -641,7 +663,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAutonomous(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAutonomous(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityOperations
 			.validateAutonomous(this, diagnostics, context);
 	}
@@ -651,24 +674,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -683,8 +708,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -694,22 +719,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__SPECIFICATION :
 				if (specification != null)
 					msgs = ((InternalEObject) specification).eInverseRemove(
@@ -717,14 +743,17 @@
 						BehavioralFeature.class, msgs);
 				return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
 			case UMLPackage.ACTIVITY__VARIABLE :
-				return ((InternalEList) getVariables())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__NODE :
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__EDGE :
-				return ((InternalEList) getEdges()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__GROUP :
-				return ((InternalEList) getGroups()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGroups())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -734,104 +763,107 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__PRECONDITION :
-				return ((InternalEList) getPreconditions()).basicRemove(
+				return ((InternalEList<?>) getPreconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__POSTCONDITION :
-				return ((InternalEList) getPostconditions()).basicRemove(
+				return ((InternalEList<?>) getPostconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 			case UMLPackage.ACTIVITY__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTIVITY__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.ACTIVITY__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.ACTIVITY__GROUP :
-				return ((InternalEList) getGroups())
-					.basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getGroups()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -841,6 +873,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
@@ -1022,15 +1055,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__NAME :
 				setName((String) newValue);
@@ -1040,22 +1077,26 @@
 				return;
 			case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1071,7 +1112,8 @@
 				return;
 			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1081,136 +1123,163 @@
 				return;
 			case UMLPackage.ACTIVITY__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ACTIVITY__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
 				return;
 			case UMLPackage.ACTIVITY__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__IS_READ_ONLY :
 				setIsReadOnly(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACTIVITY__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__PARTITION :
 				getPartitions().clear();
-				getPartitions().addAll((Collection) newValue);
+				getPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION :
 				setIsSingleExecution(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ACTIVITY__GROUP :
 				getGroups().clear();
-				getGroups().addAll((Collection) newValue);
+				getGroups().addAll(
+					(Collection<? extends ActivityGroup>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1221,6 +1290,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
@@ -1385,6 +1455,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY__EANNOTATIONS :
@@ -1541,6 +1612,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1579,6 +1651,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || eIsSet(UMLPackage.ACTIVITY__NODE)
 			|| eIsSet(UMLPackage.ACTIVITY__EDGE)
@@ -1590,6 +1663,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.ACTIVITY__VARIABLE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityNodeImpl.java
index d402b98..17a25bc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityNodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityNodeImpl.java,v 1.18 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ActivityNodeImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -43,6 +43,8 @@
 import org.eclipse.uml2.uml.ActivityGroup;
 import org.eclipse.uml2.uml.ActivityNode;
 import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.RedefinableElement;
@@ -87,7 +89,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList outgoings = null;
+	protected EList<ActivityEdge> outgoings = null;
 
 	/**
 	 * The cached value of the '{@link #getIncomings() <em>Incoming</em>}' reference list.
@@ -97,7 +99,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList incomings = null;
+	protected EList<ActivityEdge> incomings = null;
 
 	/**
 	 * The cached value of the '{@link #getInPartitions() <em>In Partition</em>}' reference list.
@@ -107,7 +109,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inPartitions = null;
+	protected EList<ActivityPartition> inPartitions = null;
 
 	/**
 	 * The cached value of the '{@link #getInInterruptibleRegions() <em>In Interruptible Region</em>}' reference list.
@@ -117,7 +119,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inInterruptibleRegions = null;
+	protected EList<InterruptibleActivityRegion> inInterruptibleRegions = null;
 
 	/**
 	 * The cached value of the '{@link #getRedefinedNodes() <em>Redefined Node</em>}' reference list.
@@ -127,7 +129,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedNodes = null;
+	protected EList<ActivityNode> redefinedNodes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -143,6 +145,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_NODE;
 	}
@@ -152,24 +155,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInGroups() {
+	public EList<ActivityGroup> getInGroups() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inGroups = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_NODE__IN_GROUP);
+			@SuppressWarnings("unchecked")
+			EList<ActivityGroup> inGroups = (EList<ActivityGroup>) cache.get(
+				eResource, this, UMLPackage.Literals.ACTIVITY_NODE__IN_GROUP);
 			if (inGroups == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ACTIVITY_NODE__IN_GROUP,
-					inGroups = new DerivedUnionEObjectEList(
+					inGroups = new DerivedUnionEObjectEList<ActivityGroup>(
 						ActivityGroup.class, this,
 						UMLPackage.ACTIVITY_NODE__IN_GROUP, IN_GROUP_ESUBSETS));
 			}
 			return inGroups;
 		}
-		return new DerivedUnionEObjectEList(ActivityGroup.class, this,
-			UMLPackage.ACTIVITY_NODE__IN_GROUP, IN_GROUP_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
+			this, UMLPackage.ACTIVITY_NODE__IN_GROUP, IN_GROUP_ESUBSETS);
 	}
 
 	/**
@@ -177,24 +181,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -204,9 +214,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutgoings() {
+	public EList<ActivityEdge> getOutgoings() {
 		if (outgoings == null) {
-			outgoings = new EObjectWithInverseResolvingEList(
+			outgoings = new EObjectWithInverseResolvingEList<ActivityEdge>(
 				ActivityEdge.class, this, UMLPackage.ACTIVITY_NODE__OUTGOING,
 				UMLPackage.ACTIVITY_EDGE__SOURCE);
 		}
@@ -229,8 +239,7 @@
 	 */
 	public ActivityEdge getOutgoing(String name, boolean ignoreCase,
 			EClass eClass) {
-		outgoingLoop : for (Iterator i = getOutgoings().iterator(); i.hasNext();) {
-			ActivityEdge outgoing = (ActivityEdge) i.next();
+		outgoingLoop : for (ActivityEdge outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
 			if (name != null && !(ignoreCase
@@ -247,9 +256,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInPartitions() {
+	public EList<ActivityPartition> getInPartitions() {
 		if (inPartitions == null) {
-			inPartitions = new EObjectWithInverseResolvingEList.ManyInverse(
+			inPartitions = new EObjectWithInverseResolvingEList.ManyInverse<ActivityPartition>(
 				ActivityPartition.class, this,
 				UMLPackage.ACTIVITY_NODE__IN_PARTITION,
 				UMLPackage.ACTIVITY_PARTITION__NODE);
@@ -272,9 +281,7 @@
 	 * @generated
 	 */
 	public ActivityPartition getInPartition(String name, boolean ignoreCase) {
-		inPartitionLoop : for (Iterator i = getInPartitions().iterator(); i
-			.hasNext();) {
-			ActivityPartition inPartition = (ActivityPartition) i.next();
+		inPartitionLoop : for (ActivityPartition inPartition : getInPartitions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(inPartition.getName())
 				: name.equals(inPartition.getName())))
@@ -415,9 +422,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getIncomings() {
+	public EList<ActivityEdge> getIncomings() {
 		if (incomings == null) {
-			incomings = new EObjectWithInverseResolvingEList(
+			incomings = new EObjectWithInverseResolvingEList<ActivityEdge>(
 				ActivityEdge.class, this, UMLPackage.ACTIVITY_NODE__INCOMING,
 				UMLPackage.ACTIVITY_EDGE__TARGET);
 		}
@@ -440,8 +447,7 @@
 	 */
 	public ActivityEdge getIncoming(String name, boolean ignoreCase,
 			EClass eClass) {
-		incomingLoop : for (Iterator i = getIncomings().iterator(); i.hasNext();) {
-			ActivityEdge incoming = (ActivityEdge) i.next();
+		incomingLoop : for (ActivityEdge incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
 			if (name != null && !(ignoreCase
@@ -458,9 +464,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInInterruptibleRegions() {
+	public EList<InterruptibleActivityRegion> getInInterruptibleRegions() {
 		if (inInterruptibleRegions == null) {
-			inInterruptibleRegions = new EObjectWithInverseResolvingEList.ManyInverse(
+			inInterruptibleRegions = new EObjectWithInverseResolvingEList.ManyInverse<InterruptibleActivityRegion>(
 				InterruptibleActivityRegion.class, this,
 				UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION,
 				UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE);
@@ -473,10 +479,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedNodes() {
+	public EList<ActivityNode> getRedefinedNodes() {
 		if (redefinedNodes == null) {
-			redefinedNodes = new EObjectResolvingEList(ActivityNode.class,
-				this, UMLPackage.ACTIVITY_NODE__REDEFINED_NODE);
+			redefinedNodes = new EObjectResolvingEList<ActivityNode>(
+				ActivityNode.class, this,
+				UMLPackage.ACTIVITY_NODE__REDEFINED_NODE);
 		}
 		return redefinedNodes;
 	}
@@ -497,9 +504,7 @@
 	 */
 	public ActivityNode getRedefinedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedNodeLoop : for (Iterator i = getRedefinedNodes().iterator(); i
-			.hasNext();) {
-			ActivityNode redefinedNode = (ActivityNode) i.next();
+		redefinedNodeLoop : for (ActivityNode redefinedNode : getRedefinedNodes()) {
 			if (eClass != null && !eClass.isInstance(redefinedNode))
 				continue redefinedNodeLoop;
 			if (name != null && !(ignoreCase
@@ -516,7 +521,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityNodeOperations.validateOwned(this, diagnostics, context);
 	}
 
@@ -526,7 +532,7 @@
 	 * @generated
 	 */
 	public boolean validateOwnedStructuredNode(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityNodeOperations.validateOwnedStructuredNode(this,
 			diagnostics, context);
 	}
@@ -536,15 +542,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -555,17 +563,17 @@
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetActivity((Activity) otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -575,18 +583,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
@@ -594,16 +603,16 @@
 			case UMLPackage.ACTIVITY_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -614,6 +623,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -633,6 +643,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
@@ -698,15 +709,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__NAME :
 				setName((String) newValue);
@@ -716,7 +731,8 @@
 				return;
 			case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -732,23 +748,29 @@
 				return;
 			case UMLPackage.ACTIVITY_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -759,6 +781,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
@@ -812,6 +835,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
@@ -919,6 +943,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || eIsSet(UMLPackage.ACTIVITY_NODE__ACTIVITY);
 	}
@@ -938,6 +963,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.ACTIVITY_NODE__REDEFINED_NODE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityParameterNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityParameterNodeImpl.java
index 51e1725..858eb23 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityParameterNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityParameterNodeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityParameterNodeImpl.java,v 1.15 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ActivityParameterNodeImpl.java,v 1.16 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,16 +19,24 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
 import org.eclipse.uml2.uml.ActivityParameterNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
 import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -79,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_PARAMETER_NODE;
 	}
@@ -133,7 +142,7 @@
 	 * @generated
 	 */
 	public boolean validateHasParameters(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityParameterNodeOperations.validateHasParameters(this,
 			diagnostics, context);
 	}
@@ -143,7 +152,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityParameterNodeOperations.validateSameType(this,
 			diagnostics, context);
 	}
@@ -153,7 +163,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityParameterNodeOperations.validateNoEdges(this,
 			diagnostics, context);
 	}
@@ -164,7 +175,7 @@
 	 * @generated
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityParameterNodeOperations.validateNoIncomingEdges(this,
 			diagnostics, context);
 	}
@@ -175,7 +186,7 @@
 	 * @generated
 	 */
 	public boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityParameterNodeOperations.validateNoOutgoingEdges(this,
 			diagnostics, context);
 	}
@@ -185,6 +196,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
@@ -274,15 +286,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME :
 				setName((String) newValue);
@@ -292,7 +308,8 @@
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -308,23 +325,29 @@
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE :
 				setType((Type) newValue);
@@ -340,7 +363,7 @@
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION :
 				setSelection((Behavior) newValue);
@@ -357,6 +380,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
@@ -431,6 +455,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityPartitionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityPartitionImpl.java
index 67edb19..e4bcd0e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityPartitionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActivityPartitionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityPartitionImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ActivityPartitionImpl.java,v 1.24 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -43,6 +43,8 @@
 import org.eclipse.uml2.uml.ActivityGroup;
 import org.eclipse.uml2.uml.ActivityNode;
 import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -129,7 +131,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nodes = null;
+	protected EList<ActivityNode> nodes = null;
 
 	/**
 	 * The cached value of the '{@link #getSubpartitions() <em>Subpartition</em>}' containment reference list.
@@ -139,7 +141,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList subpartitions = null;
+	protected EList<ActivityPartition> subpartitions = null;
 
 	/**
 	 * The cached value of the '{@link #getRepresents() <em>Represents</em>}' reference.
@@ -159,7 +161,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList edges = null;
+	protected EList<ActivityEdge> edges = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -175,6 +177,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTIVITY_PARTITION;
 	}
@@ -184,25 +187,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubgroups() {
+	public EList<ActivityGroup> getSubgroups() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList subgroups = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			@SuppressWarnings("unchecked")
+			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
+				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
 			if (subgroups == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP,
-					subgroups = new DerivedUnionEObjectEList(
+					subgroups = new DerivedUnionEObjectEList<ActivityGroup>(
 						ActivityGroup.class, this,
 						UMLPackage.ACTIVITY_PARTITION__SUBGROUP,
 						SUBGROUP_ESUBSETS));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList(ActivityGroup.class, this,
-			UMLPackage.ACTIVITY_PARTITION__SUBGROUP, SUBGROUP_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
+			this, UMLPackage.ACTIVITY_PARTITION__SUBGROUP, SUBGROUP_ESUBSETS);
 	}
 
 	/**
@@ -210,23 +214,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -236,25 +242,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedNodes() {
+	public EList<ActivityNode> getContainedNodes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedNodes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
 			if (containedNodes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
-					containedNodes = new DerivedUnionEObjectEList(
-						ActivityNode.class, this,
-						UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE,
-						CONTAINED_NODE_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
+						containedNodes = new DerivedUnionEObjectEList<ActivityNode>(
+							ActivityNode.class, this,
+							UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE,
+							CONTAINED_NODE_ESUBSETS));
 			}
 			return containedNodes;
 		}
-		return new DerivedUnionEObjectEList(ActivityNode.class, this,
-			UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE,
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class,
+			this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE,
 			CONTAINED_NODE_ESUBSETS);
 	}
 
@@ -274,9 +285,7 @@
 	 */
 	public ActivityNode getContainedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedNodeLoop : for (Iterator i = getContainedNodes().iterator(); i
-			.hasNext();) {
-			ActivityNode containedNode = (ActivityNode) i.next();
+		containedNodeLoop : for (ActivityNode containedNode : getContainedNodes()) {
 			if (eClass != null && !eClass.isInstance(containedNode))
 				continue containedNodeLoop;
 			if (name != null && !(ignoreCase
@@ -293,25 +302,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedEdges() {
+	public EList<ActivityEdge> getContainedEdges() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedEdges = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
 			if (containedEdges == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
-					containedEdges = new DerivedUnionEObjectEList(
-						ActivityEdge.class, this,
-						UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE,
-						CONTAINED_EDGE_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
+						containedEdges = new DerivedUnionEObjectEList<ActivityEdge>(
+							ActivityEdge.class, this,
+							UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE,
+							CONTAINED_EDGE_ESUBSETS));
 			}
 			return containedEdges;
 		}
-		return new DerivedUnionEObjectEList(ActivityEdge.class, this,
-			UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE,
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class,
+			this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE,
 			CONTAINED_EDGE_ESUBSETS);
 	}
 
@@ -331,9 +345,7 @@
 	 */
 	public ActivityEdge getContainedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedEdgeLoop : for (Iterator i = getContainedEdges().iterator(); i
-			.hasNext();) {
-			ActivityEdge containedEdge = (ActivityEdge) i.next();
+		containedEdgeLoop : for (ActivityEdge containedEdge : getContainedEdges()) {
 			if (eClass != null && !eClass.isInstance(containedEdge))
 				continue containedEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -469,9 +481,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEdges() {
+	public EList<ActivityEdge> getEdges() {
 		if (edges == null) {
-			edges = new EObjectWithInverseResolvingEList.ManyInverse(
+			edges = new EObjectWithInverseResolvingEList.ManyInverse<ActivityEdge>(
 				ActivityEdge.class, this, UMLPackage.ACTIVITY_PARTITION__EDGE,
 				UMLPackage.ACTIVITY_EDGE__IN_PARTITION);
 		}
@@ -493,8 +505,7 @@
 	 * @generated
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase, EClass eClass) {
-		edgeLoop : for (Iterator i = getEdges().iterator(); i.hasNext();) {
-			ActivityEdge edge = (ActivityEdge) i.next();
+		edgeLoop : for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
 			if (name != null && !(ignoreCase
@@ -511,9 +522,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNodes() {
+	public EList<ActivityNode> getNodes() {
 		if (nodes == null) {
-			nodes = new EObjectWithInverseResolvingEList.ManyInverse(
+			nodes = new EObjectWithInverseResolvingEList.ManyInverse<ActivityNode>(
 				ActivityNode.class, this, UMLPackage.ACTIVITY_PARTITION__NODE,
 				UMLPackage.ACTIVITY_NODE__IN_PARTITION);
 		}
@@ -535,8 +546,7 @@
 	 * @generated
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase, EClass eClass) {
-		nodeLoop : for (Iterator i = getNodes().iterator(); i.hasNext();) {
-			ActivityNode node = (ActivityNode) i.next();
+		nodeLoop : for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
 			if (name != null && !(ignoreCase
@@ -553,9 +563,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubpartitions() {
+	public EList<ActivityPartition> getSubpartitions() {
 		if (subpartitions == null) {
-			subpartitions = new EObjectContainmentWithInverseEList.Resolving(
+			subpartitions = new EObjectContainmentWithInverseEList.Resolving<ActivityPartition>(
 				ActivityPartition.class, this,
 				UMLPackage.ACTIVITY_PARTITION__SUBPARTITION,
 				UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION);
@@ -592,9 +602,7 @@
 	 */
 	public ActivityPartition getSubpartition(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		subpartitionLoop : for (Iterator i = getSubpartitions().iterator(); i
-			.hasNext();) {
-			ActivityPartition subpartition = (ActivityPartition) i.next();
+		subpartitionLoop : for (ActivityPartition subpartition : getSubpartitions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(subpartition.getName())
 				: name.equals(subpartition.getName())))
@@ -720,7 +728,7 @@
 	 * @generated
 	 */
 	public boolean validateNodesAndEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics,
 			context);
 	}
@@ -730,7 +738,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotContained(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNotContained(this, diagnostics,
 			context);
 	}
@@ -740,7 +749,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGroupOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGroupOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateGroupOwned(this, diagnostics,
 			context);
 	}
@@ -751,7 +761,7 @@
 	 * @generated
 	 */
 	public boolean validateDimensionNotContained(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityPartitionOperations.validateDimensionNotContained(this,
 			diagnostics, context);
 	}
@@ -762,7 +772,7 @@
 	 * @generated
 	 */
 	public boolean validateRepresentsPart(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityPartitionOperations.validateRepresentsPart(this,
 			diagnostics, context);
 	}
@@ -773,7 +783,7 @@
 	 * @generated
 	 */
 	public boolean validateRepresentsClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityPartitionOperations.validateRepresentsClassifier(this,
 			diagnostics, context);
 	}
@@ -784,7 +794,7 @@
 	 * @generated
 	 */
 	public boolean validateRepresentsPartAndIsContained(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ActivityPartitionOperations
 			.validateRepresentsPartAndIsContained(this, diagnostics, context);
 	}
@@ -794,31 +804,35 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetInActivity((Activity) otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				return ((InternalEList) getSubpartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubpartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetSuperPartition((ActivityPartition) otherEnd,
 					msgs);
 			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				return ((InternalEList) getEdges()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -828,31 +842,34 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				return ((InternalEList) getSubpartitions()).basicRemove(
+				return ((InternalEList<?>) getSubpartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
 				return basicSetSuperPartition(null, msgs);
 			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -862,6 +879,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -881,6 +899,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
@@ -954,15 +973,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__NAME :
 				setName((String) newValue);
@@ -972,7 +995,8 @@
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -988,11 +1012,13 @@
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
 				getSubpartitions().clear();
-				getSubpartitions().addAll((Collection) newValue);
+				getSubpartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
 				setSuperPartition((ActivityPartition) newValue);
@@ -1002,7 +1028,8 @@
 				return;
 			case UMLPackage.ACTIVITY_PARTITION__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1013,6 +1040,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
@@ -1066,6 +1094,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
@@ -1124,7 +1153,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ActivityGroup.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.ACTIVITY_PARTITION__SUBGROUP :
@@ -1149,7 +1179,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ActivityGroup.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.ACTIVITY_GROUP__SUBGROUP :
@@ -1174,6 +1205,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1224,6 +1256,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || isSetSubgroups();
 	}
@@ -1297,6 +1330,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || isSetSuperGroup()
 			|| eIsSet(UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActorImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActorImpl.java
index c12e82d..77d353e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActorImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ActorImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActorImpl.java,v 1.2 2005/11/23 20:01:20 khussey Exp $
+ * $Id: ActorImpl.java,v 1.3 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ACTOR;
 	}
@@ -59,7 +60,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAssociations(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAssociations(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActorOperations.validateAssociations(this, diagnostics, context);
 	}
 
@@ -68,7 +70,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMustHaveName(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActorOperations.validateMustHaveName(this, diagnostics, context);
 	}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddStructuralFeatureValueActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddStructuralFeatureValueActionImpl.java
index f3a0dd7..0649192 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddStructuralFeatureValueActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddStructuralFeatureValueActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddStructuralFeatureValueActionImpl.java,v 1.22 2006/11/14 18:02:16 khussey Exp $
+ * $Id: AddStructuralFeatureValueActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,8 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.AddStructuralFeatureValueAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuralFeature;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -109,6 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION;
 	}
@@ -118,22 +128,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
 			INPUT_ESUBSETS);
 	}
@@ -299,7 +311,7 @@
 	 * @generated
 	 */
 	public boolean validateUnlimitedNaturalAndMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return AddStructuralFeatureValueActionOperations
 			.validateUnlimitedNaturalAndMultiplicity(this, diagnostics, context);
 	}
@@ -309,18 +321,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
@@ -328,26 +341,26 @@
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
@@ -363,6 +376,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -462,15 +476,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
 				setName((String) newValue);
@@ -480,7 +498,8 @@
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -496,35 +515,44 @@
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
 				setStructuralFeature((StructuralFeature) newValue);
@@ -550,6 +578,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -627,6 +656,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -708,6 +738,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -737,6 +768,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddVariableValueActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddVariableValueActionImpl.java
index fa69a32..82ac801 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddVariableValueActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AddVariableValueActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddVariableValueActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: AddVariableValueActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,8 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.AddVariableValueAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -109,6 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION;
 	}
@@ -118,22 +128,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -287,7 +299,7 @@
 	 * @generated
 	 */
 	public boolean validateSingleInputPin(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AddVariableValueActionOperations.validateSingleInputPin(this,
 			diagnostics, context);
 	}
@@ -297,18 +309,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
@@ -316,26 +329,26 @@
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
 				return basicSetValue(null, msgs);
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
@@ -349,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -444,15 +458,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME :
 				setName((String) newValue);
@@ -462,7 +480,8 @@
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -478,35 +497,44 @@
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE :
 				setVariable((Variable) newValue);
@@ -529,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -603,6 +632,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -682,6 +712,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -710,6 +741,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AnyReceiveEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AnyReceiveEventImpl.java
index eecff08..fac0ded 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AnyReceiveEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AnyReceiveEventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AnyReceiveEventImpl.java,v 1.2 2005/11/23 20:01:17 khussey Exp $
+ * $Id: AnyReceiveEventImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ANY_RECEIVE_EVENT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ArtifactImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ArtifactImpl.java
index 2f65820..1a4dca8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ArtifactImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ArtifactImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ArtifactImpl.java,v 1.26 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ArtifactImpl.java,v 1.27 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,21 +35,31 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.Artifact;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Manifestation;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.PackageableElement;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.ArtifactOperations;
@@ -117,7 +127,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nestedArtifacts = null;
+	protected EList<Artifact> nestedArtifacts = null;
 
 	/**
 	 * The cached value of the '{@link #getManifestations() <em>Manifestation</em>}' containment reference list.
@@ -127,7 +137,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList manifestations = null;
+	protected EList<Manifestation> manifestations = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedOperations() <em>Owned Operation</em>}' containment reference list.
@@ -137,7 +147,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedOperations = null;
+	protected EList<Operation> ownedOperations = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedAttributes() <em>Owned Attribute</em>}' containment reference list.
@@ -147,7 +157,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -163,6 +173,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ARTIFACT;
 	}
@@ -172,25 +183,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.ARTIFACT__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ARTIFACT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ARTIFACT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -198,23 +210,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ARTIFACT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.ARTIFACT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ARTIFACT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -223,22 +237,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.ARTIFACT__FEATURE, FEATURE_ESUBSETS));
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.ARTIFACT__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.ARTIFACT__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -247,23 +263,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.ARTIFACT__ATTRIBUTE,
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.ARTIFACT__ATTRIBUTE,
 						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.ARTIFACT__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -272,9 +289,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this, UMLPackage.ARTIFACT__CLIENT_DEPENDENCY,
 				null, CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
 		}
@@ -338,9 +355,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNestedArtifacts() {
+	public EList<Artifact> getNestedArtifacts() {
 		if (nestedArtifacts == null) {
-			nestedArtifacts = new EObjectContainmentEList.Resolving(
+			nestedArtifacts = new EObjectContainmentEList.Resolving<Artifact>(
 				Artifact.class, this, UMLPackage.ARTIFACT__NESTED_ARTIFACT);
 		}
 		return nestedArtifacts;
@@ -384,9 +401,7 @@
 	 */
 	public Artifact getNestedArtifact(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedArtifactLoop : for (Iterator i = getNestedArtifacts().iterator(); i
-			.hasNext();) {
-			Artifact nestedArtifact = (Artifact) i.next();
+		nestedArtifactLoop : for (Artifact nestedArtifact : getNestedArtifacts()) {
 			if (eClass != null && !eClass.isInstance(nestedArtifact))
 				continue nestedArtifactLoop;
 			if (name != null && !(ignoreCase
@@ -405,9 +420,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getManifestations() {
+	public EList<Manifestation> getManifestations() {
 		if (manifestations == null) {
-			manifestations = new SubsetSupersetEObjectContainmentEList.Resolving(
+			manifestations = new SubsetSupersetEObjectContainmentEList.Resolving<Manifestation>(
 				Manifestation.class, this, UMLPackage.ARTIFACT__MANIFESTATION,
 				MANIFESTATION_ESUPERSETS, null);
 		}
@@ -448,9 +463,7 @@
 	public Manifestation getManifestation(String name,
 			PackageableElement utilizedElement, boolean ignoreCase,
 			boolean createOnDemand) {
-		manifestationLoop : for (Iterator i = getManifestations().iterator(); i
-			.hasNext();) {
-			Manifestation manifestation = (Manifestation) i.next();
+		manifestationLoop : for (Manifestation manifestation : getManifestations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(manifestation.getName())
 				: name.equals(manifestation.getName())))
@@ -470,9 +483,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedOperations() {
+	public EList<Operation> getOwnedOperations() {
 		if (ownedOperations == null) {
-			ownedOperations = new EObjectContainmentEList.Resolving(
+			ownedOperations = new EObjectContainmentEList.Resolving<Operation>(
 				Operation.class, this, UMLPackage.ARTIFACT__OWNED_OPERATION);
 		}
 		return ownedOperations;
@@ -484,7 +497,7 @@
 	 * @generated
 	 */
 	public Operation createOwnedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
@@ -515,8 +528,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedOperation(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -526,28 +539,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedOperationLoop : for (Iterator i = getOwnedOperations().iterator(); i
-			.hasNext();) {
-			Operation ownedOperation = (Operation) i.next();
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedOperationLoop : for (Operation ownedOperation : getOwnedOperations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedOperation.getName())
 				: name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList ownedParameterList = ownedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -570,9 +581,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this, UMLPackage.ARTIFACT__OWNED_ATTRIBUTE);
 		}
 		return ownedAttributes;
@@ -618,9 +629,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -641,8 +650,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType) {
+	public Operation createOwnedOperation(String name,
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			Type returnType) {
 		return ArtifactOperations.createOwnedOperation(this, name,
 			parameterNames, parameterTypes, returnType);
 	}
@@ -663,24 +673,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -695,8 +707,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -706,16 +718,17 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.ARTIFACT__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -725,67 +738,68 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ARTIFACT__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				return ((InternalEList) getNestedArtifacts()).basicRemove(
+				return ((InternalEList<?>) getNestedArtifacts()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__MANIFESTATION :
-				return ((InternalEList) getManifestations()).basicRemove(
+				return ((InternalEList<?>) getManifestations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -796,6 +810,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
@@ -911,15 +926,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__NAME :
 				setName((String) newValue);
@@ -929,22 +948,26 @@
 				return;
 			case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -960,7 +983,8 @@
 				return;
 			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -970,57 +994,68 @@
 				return;
 			case UMLPackage.ARTIFACT__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ARTIFACT__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__FILE_NAME :
 				setFileName((String) newValue);
 				return;
 			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
 				getNestedArtifacts().clear();
-				getNestedArtifacts().addAll((Collection) newValue);
+				getNestedArtifacts().addAll(
+					(Collection<? extends Artifact>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__MANIFESTATION :
 				getManifestations().clear();
-				getManifestations().addAll((Collection) newValue);
+				getManifestations().addAll(
+					(Collection<? extends Manifestation>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1031,6 +1066,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
@@ -1132,6 +1168,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ARTIFACT__EANNOTATIONS :
@@ -1232,6 +1269,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1265,6 +1303,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.ARTIFACT__NESTED_ARTIFACT)
@@ -1296,6 +1335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.ARTIFACT__MANIFESTATION);
@@ -1317,6 +1357,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.ARTIFACT__OWNED_OPERATION);
@@ -1358,6 +1399,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationClassImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationClassImpl.java
index a47f3f2..73941f3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationClassImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationClassImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AssociationClassImpl.java,v 1.27 2006/11/14 18:02:18 khussey Exp $
+ * $Id: AssociationClassImpl.java,v 1.28 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -41,17 +41,34 @@
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.AssociationClass;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.Relationship;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.AssociationClassOperations;
@@ -90,7 +107,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedEnds = null;
+	protected EList<Property> ownedEnds = null;
 
 	/**
 	 * The cached value of the '{@link #getMemberEnds() <em>Member End</em>}' reference list.
@@ -100,7 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList memberEnds = null;
+	protected EList<Property> memberEnds = null;
 
 	/**
 	 * The default value of the '{@link #isDerived() <em>Is Derived</em>}' attribute.
@@ -130,7 +147,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList navigableOwnedEnds = null;
+	protected EList<Property> navigableOwnedEnds = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -146,6 +163,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ASSOCIATION_CLASS;
 	}
@@ -155,24 +173,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT,
 			RELATED_ELEMENT_ESUBSETS);
 	}
@@ -182,24 +202,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.ASSOCIATION_CLASS__MEMBER,
-						MEMBER_ESUBSETS));
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -207,23 +228,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.ASSOCIATION_CLASS__FEATURE,
-						FEATURE_ESUBSETS));
+				cache
+					.put(eResource, this,
+						UMLPackage.Literals.CLASSIFIER__FEATURE,
+						features = new DerivedUnionEObjectEList<Feature>(
+							Feature.class, this,
+							UMLPackage.ASSOCIATION_CLASS__FEATURE,
+							FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.ASSOCIATION_CLASS__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -232,25 +256,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER,
+			OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -258,9 +284,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMemberEnds() {
+	public EList<Property> getMemberEnds() {
 		if (memberEnds == null) {
-			memberEnds = new SubsetSupersetEObjectWithInverseResolvingEList(
+			memberEnds = new SubsetSupersetEObjectWithInverseResolvingEList<Property>(
 				Property.class, this, UMLPackage.ASSOCIATION_CLASS__MEMBER_END,
 				null, MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
 		}
@@ -283,9 +309,7 @@
 	 */
 	public Property getMemberEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		memberEndLoop : for (Iterator i = getMemberEnds().iterator(); i
-			.hasNext();) {
-			Property memberEnd = (Property) i.next();
+		memberEndLoop : for (Property memberEnd : getMemberEnds()) {
 			if (eClass != null && !eClass.isInstance(memberEnd))
 				continue memberEndLoop;
 			if (name != null && !(ignoreCase
@@ -304,9 +328,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedEnds() {
+	public EList<Property> getOwnedEnds() {
 		if (ownedEnds == null) {
-			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
 				Property.class, this, UMLPackage.ASSOCIATION_CLASS__OWNED_END,
 				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
 				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
@@ -354,8 +378,7 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedEndLoop : for (Iterator i = getOwnedEnds().iterator(); i.hasNext();) {
-			Property ownedEnd = (Property) i.next();
+		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(ownedEnd))
 				continue ownedEndLoop;
 			if (name != null && !(ignoreCase
@@ -404,11 +427,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEndTypes() {
+	public EList<Type> getEndTypes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Type> result = (EList<Type>) cache.get(this,
 				UMLPackage.Literals.ASSOCIATION__END_TYPE);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE,
@@ -434,8 +458,7 @@
 	 * @generated
 	 */
 	public Type getEndType(String name, boolean ignoreCase, EClass eClass) {
-		endTypeLoop : for (Iterator i = getEndTypes().iterator(); i.hasNext();) {
-			Type endType = (Type) i.next();
+		endTypeLoop : for (Type endType : getEndTypes()) {
 			if (eClass != null && !eClass.isInstance(endType))
 				continue endTypeLoop;
 			if (name != null && !(ignoreCase
@@ -452,9 +475,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNavigableOwnedEnds() {
+	public EList<Property> getNavigableOwnedEnds() {
 		if (navigableOwnedEnds == null) {
-			navigableOwnedEnds = new SubsetSupersetEObjectResolvingEList(
+			navigableOwnedEnds = new SubsetSupersetEObjectResolvingEList<Property>(
 				Property.class, this,
 				UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END,
 				NAVIGABLE_OWNED_END_ESUPERSETS, null);
@@ -503,9 +526,7 @@
 	 */
 	public Property getNavigableOwnedEnd(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		navigableOwnedEndLoop : for (Iterator i = getNavigableOwnedEnds()
-			.iterator(); i.hasNext();) {
-			Property navigableOwnedEnd = (Property) i.next();
+		navigableOwnedEndLoop : for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(navigableOwnedEnd))
 				continue navigableOwnedEndLoop;
 			if (name != null && !(ignoreCase
@@ -527,7 +548,7 @@
 	 * @generated
 	 */
 	public boolean validateSpecializedEndNumber(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateSpecializedEndNumber(this,
 			diagnostics, context);
 	}
@@ -538,7 +559,7 @@
 	 * @generated
 	 */
 	public boolean validateSpecializedEndTypes(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateSpecializedEndTypes(this,
 			diagnostics, context);
 	}
@@ -549,7 +570,7 @@
 	 * @generated
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateBinaryAssociations(this,
 			diagnostics, context);
 	}
@@ -560,7 +581,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateAssociationEnds(this, diagnostics,
 			context);
 	}
@@ -580,7 +601,7 @@
 	 * @generated
 	 */
 	public boolean validateCannotBeDefined(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationClassOperations.validateCannotBeDefined(this,
 			diagnostics, context);
 	}
@@ -590,10 +611,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allConnections() {
+	public EList<Property> allConnections() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Property> result = (EList<Property>) cache.get(this,
 				UMLPackage.Literals.ASSOCIATION_CLASS.getEOperations().get(1));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ASSOCIATION_CLASS
@@ -610,24 +632,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -642,8 +666,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -655,28 +679,29 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return ((InternalEList) getOwnedEnds())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return ((InternalEList) getMemberEnds()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -686,86 +711,87 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return ((InternalEList) getOwnedEnds()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedEnds()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return ((InternalEList) getMemberEnds()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getMemberEnds()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -775,6 +801,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
@@ -928,15 +955,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__NAME :
 				setName((String) newValue);
@@ -946,22 +977,26 @@
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -977,7 +1012,8 @@
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -987,99 +1023,119 @@
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
 				getOwnedEnds().clear();
-				getOwnedEnds().addAll((Collection) newValue);
+				getOwnedEnds()
+					.addAll((Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
 				getMemberEnds().clear();
-				getMemberEnds().addAll((Collection) newValue);
+				getMemberEnds().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
 				setIsDerived(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
 				getNavigableOwnedEnds().clear();
-				getNavigableOwnedEnds().addAll((Collection) newValue);
+				getNavigableOwnedEnds().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1090,6 +1146,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
@@ -1224,6 +1281,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
@@ -1359,7 +1417,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT :
@@ -1392,7 +1451,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
@@ -1425,6 +1485,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1475,6 +1536,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers()
 			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__MEMBER_END);
@@ -1485,6 +1547,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
@@ -1515,6 +1578,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationImpl.java
index 0f83302..d61b064 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/AssociationImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AssociationImpl.java,v 1.27 2006/11/14 18:02:18 khussey Exp $
+ * $Id: AssociationImpl.java,v 1.28 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -39,17 +39,28 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Relationship;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.AssociationOperations;
@@ -87,7 +98,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedEnds = null;
+	protected EList<Property> ownedEnds = null;
 
 	/**
 	 * The cached value of the '{@link #getMemberEnds() <em>Member End</em>}' reference list.
@@ -97,7 +108,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList memberEnds = null;
+	protected EList<Property> memberEnds = null;
 
 	/**
 	 * The default value of the '{@link #isDerived() <em>Is Derived</em>}' attribute.
@@ -127,7 +138,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList navigableOwnedEnds = null;
+	protected EList<Property> navigableOwnedEnds = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -143,6 +154,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ASSOCIATION;
 	}
@@ -152,24 +164,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.ASSOCIATION__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ASSOCIATION__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
@@ -178,23 +192,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS));
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -202,24 +218,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
-				cache
-					.put(eResource, this,
-						UMLPackage.Literals.CLASSIFIER__FEATURE,
-						features = new DerivedUnionEObjectEList(Feature.class,
-							this, UMLPackage.ASSOCIATION__FEATURE,
-							FEATURE_ESUBSETS));
+				cache.put(eResource, this,
+					UMLPackage.Literals.CLASSIFIER__FEATURE,
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.ASSOCIATION__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.ASSOCIATION__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -228,25 +244,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.ASSOCIATION__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ASSOCIATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ASSOCIATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -254,9 +271,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMemberEnds() {
+	public EList<Property> getMemberEnds() {
 		if (memberEnds == null) {
-			memberEnds = new SubsetSupersetEObjectWithInverseResolvingEList(
+			memberEnds = new SubsetSupersetEObjectWithInverseResolvingEList<Property>(
 				Property.class, this, UMLPackage.ASSOCIATION__MEMBER_END, null,
 				MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
 		}
@@ -279,9 +296,7 @@
 	 */
 	public Property getMemberEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		memberEndLoop : for (Iterator i = getMemberEnds().iterator(); i
-			.hasNext();) {
-			Property memberEnd = (Property) i.next();
+		memberEndLoop : for (Property memberEnd : getMemberEnds()) {
 			if (eClass != null && !eClass.isInstance(memberEnd))
 				continue memberEndLoop;
 			if (name != null && !(ignoreCase
@@ -300,9 +315,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedEnds() {
+	public EList<Property> getOwnedEnds() {
 		if (ownedEnds == null) {
-			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
 				Property.class, this, UMLPackage.ASSOCIATION__OWNED_END,
 				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
 				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
@@ -350,8 +365,7 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedEndLoop : for (Iterator i = getOwnedEnds().iterator(); i.hasNext();) {
-			Property ownedEnd = (Property) i.next();
+		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(ownedEnd))
 				continue ownedEndLoop;
 			if (name != null && !(ignoreCase
@@ -399,11 +413,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEndTypes() {
+	public EList<Type> getEndTypes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Type> result = (EList<Type>) cache.get(this,
 				UMLPackage.Literals.ASSOCIATION__END_TYPE);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE,
@@ -429,8 +444,7 @@
 	 * @generated
 	 */
 	public Type getEndType(String name, boolean ignoreCase, EClass eClass) {
-		endTypeLoop : for (Iterator i = getEndTypes().iterator(); i.hasNext();) {
-			Type endType = (Type) i.next();
+		endTypeLoop : for (Type endType : getEndTypes()) {
 			if (eClass != null && !eClass.isInstance(endType))
 				continue endTypeLoop;
 			if (name != null && !(ignoreCase
@@ -447,9 +461,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNavigableOwnedEnds() {
+	public EList<Property> getNavigableOwnedEnds() {
 		if (navigableOwnedEnds == null) {
-			navigableOwnedEnds = new SubsetSupersetEObjectResolvingEList(
+			navigableOwnedEnds = new SubsetSupersetEObjectResolvingEList<Property>(
 				Property.class, this,
 				UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END,
 				NAVIGABLE_OWNED_END_ESUPERSETS, null);
@@ -498,9 +512,7 @@
 	 */
 	public Property getNavigableOwnedEnd(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		navigableOwnedEndLoop : for (Iterator i = getNavigableOwnedEnds()
-			.iterator(); i.hasNext();) {
-			Property navigableOwnedEnd = (Property) i.next();
+		navigableOwnedEndLoop : for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(navigableOwnedEnd))
 				continue navigableOwnedEndLoop;
 			if (name != null && !(ignoreCase
@@ -522,7 +534,7 @@
 	 * @generated
 	 */
 	public boolean validateSpecializedEndNumber(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateSpecializedEndNumber(this,
 			diagnostics, context);
 	}
@@ -533,7 +545,7 @@
 	 * @generated
 	 */
 	public boolean validateSpecializedEndTypes(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateSpecializedEndTypes(this,
 			diagnostics, context);
 	}
@@ -544,7 +556,7 @@
 	 * @generated
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateBinaryAssociations(this,
 			diagnostics, context);
 	}
@@ -555,7 +567,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return AssociationOperations.validateAssociationEnds(this, diagnostics,
 			context);
 	}
@@ -574,24 +586,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -606,8 +620,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -617,22 +631,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_END :
-				return ((InternalEList) getOwnedEnds())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return ((InternalEList) getMemberEnds()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -642,62 +657,63 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ASSOCIATION__OWNED_END :
-				return ((InternalEList) getOwnedEnds()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedEnds()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return ((InternalEList) getMemberEnds()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getMemberEnds()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -707,6 +723,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
@@ -826,15 +843,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__NAME :
 				setName((String) newValue);
@@ -844,22 +865,26 @@
 				return;
 			case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -875,7 +900,8 @@
 				return;
 			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -885,53 +911,63 @@
 				return;
 			case UMLPackage.ASSOCIATION__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__OWNED_END :
 				getOwnedEnds().clear();
-				getOwnedEnds().addAll((Collection) newValue);
+				getOwnedEnds()
+					.addAll((Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__MEMBER_END :
 				getMemberEnds().clear();
-				getMemberEnds().addAll((Collection) newValue);
+				getMemberEnds().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ASSOCIATION__IS_DERIVED :
 				setIsDerived(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
 				getNavigableOwnedEnds().clear();
-				getNavigableOwnedEnds().addAll((Collection) newValue);
+				getNavigableOwnedEnds().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -942,6 +978,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
@@ -1040,6 +1077,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ASSOCIATION__EANNOTATIONS :
@@ -1143,7 +1181,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.ASSOCIATION__RELATED_ELEMENT :
@@ -1160,7 +1199,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
@@ -1177,6 +1217,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1223,6 +1264,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers()
 			|| eIsSet(UMLPackage.ASSOCIATION__MEMBER_END);
@@ -1233,6 +1275,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
@@ -1256,6 +1299,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorExecutionSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorExecutionSpecificationImpl.java
index 0a5ac4d..54cb76f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorExecutionSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorExecutionSpecificationImpl.java
@@ -8,13 +8,14 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehaviorExecutionSpecificationImpl.java,v 1.13 2006/11/14 18:02:15 khussey Exp $
+ * $Id: BehaviorExecutionSpecificationImpl.java,v 1.14 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -22,8 +23,12 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehaviorExecutionSpecification;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.OccurrenceSpecification;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -70,6 +75,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION;
 	}
@@ -123,6 +129,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -184,15 +191,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -202,18 +213,20 @@
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -239,6 +252,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -289,6 +303,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorImpl.java
index ec907e4..bad1971 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehaviorImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehaviorImpl.java,v 1.28 2006/11/14 18:02:18 khussey Exp $
+ * $Id: BehaviorImpl.java,v 1.29 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -42,16 +42,32 @@
 import org.eclipse.uml2.uml.BehavioredClassifier;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.BehaviorOperations;
@@ -111,7 +127,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedBehaviors = null;
+	protected EList<Behavior> redefinedBehaviors = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedParameters() <em>Owned Parameter</em>}' containment reference list.
@@ -121,7 +137,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameters = null;
+	protected EList<Parameter> ownedParameters = null;
 
 	/**
 	 * The cached value of the '{@link #getPreconditions() <em>Precondition</em>}' containment reference list.
@@ -131,7 +147,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList preconditions = null;
+	protected EList<Constraint> preconditions = null;
 
 	/**
 	 * The cached value of the '{@link #getPostconditions() <em>Postcondition</em>}' containment reference list.
@@ -141,7 +157,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList postconditions = null;
+	protected EList<Constraint> postconditions = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedParameterSets() <em>Owned Parameter Set</em>}' containment reference list.
@@ -151,7 +167,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameterSets = null;
+	protected EList<ParameterSet> ownedParameterSets = null;
 
 	/**
 	 * The cached value of the '{@link #getSpecification() <em>Specification</em>}' reference.
@@ -177,6 +193,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.BEHAVIOR;
 	}
@@ -186,24 +203,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.BEHAVIOR__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.BEHAVIOR__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.BEHAVIOR__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -212,25 +235,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.BEHAVIOR__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.BEHAVIOR__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.BEHAVIOR__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -238,27 +262,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class, this,
 							UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT,
 							REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -296,10 +324,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedBehaviors() {
+	public EList<Behavior> getRedefinedBehaviors() {
 		if (redefinedBehaviors == null) {
-			redefinedBehaviors = new EObjectResolvingEList(Behavior.class,
-				this, UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR);
+			redefinedBehaviors = new EObjectResolvingEList<Behavior>(
+				Behavior.class, this, UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR);
 		}
 		return redefinedBehaviors;
 	}
@@ -320,9 +348,7 @@
 	 */
 	public Behavior getRedefinedBehavior(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedBehaviorLoop : for (Iterator i = getRedefinedBehaviors()
-			.iterator(); i.hasNext();) {
-			Behavior redefinedBehavior = (Behavior) i.next();
+		redefinedBehaviorLoop : for (Behavior redefinedBehavior : getRedefinedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(redefinedBehavior))
 				continue redefinedBehaviorLoop;
 			if (name != null && !(ignoreCase
@@ -339,9 +365,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameters() {
+	public EList<Parameter> getOwnedParameters() {
 		if (ownedParameters == null) {
-			ownedParameters = new EObjectContainmentEList.Resolving(
+			ownedParameters = new EObjectContainmentEList.Resolving<Parameter>(
 				Parameter.class, this, UMLPackage.BEHAVIOR__OWNED_PARAMETER);
 		}
 		return ownedParameters;
@@ -378,9 +404,7 @@
 	 */
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Iterator i = getOwnedParameters().iterator(); i
-			.hasNext();) {
-			Parameter ownedParameter = (Parameter) i.next();
+		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedParameter.getName())
 				: name.equals(ownedParameter.getName())))
@@ -421,9 +445,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPreconditions() {
+	public EList<Constraint> getPreconditions() {
 		if (preconditions == null) {
-			preconditions = new EObjectContainmentEList.Resolving(
+			preconditions = new EObjectContainmentEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.BEHAVIOR__PRECONDITION);
 		}
 		return preconditions;
@@ -467,9 +491,7 @@
 	 */
 	public Constraint getPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		preconditionLoop : for (Iterator i = getPreconditions().iterator(); i
-			.hasNext();) {
-			Constraint precondition = (Constraint) i.next();
+		preconditionLoop : for (Constraint precondition : getPreconditions()) {
 			if (eClass != null && !eClass.isInstance(precondition))
 				continue preconditionLoop;
 			if (name != null && !(ignoreCase
@@ -488,9 +510,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPostconditions() {
+	public EList<Constraint> getPostconditions() {
 		if (postconditions == null) {
-			postconditions = new EObjectContainmentEList.Resolving(
+			postconditions = new EObjectContainmentEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.BEHAVIOR__POSTCONDITION);
 		}
 		return postconditions;
@@ -534,9 +556,7 @@
 	 */
 	public Constraint getPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		postconditionLoop : for (Iterator i = getPostconditions().iterator(); i
-			.hasNext();) {
-			Constraint postcondition = (Constraint) i.next();
+		postconditionLoop : for (Constraint postcondition : getPostconditions()) {
 			if (eClass != null && !eClass.isInstance(postcondition))
 				continue postconditionLoop;
 			if (name != null && !(ignoreCase
@@ -555,9 +575,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameterSets() {
+	public EList<ParameterSet> getOwnedParameterSets() {
 		if (ownedParameterSets == null) {
-			ownedParameterSets = new EObjectContainmentEList.Resolving(
+			ownedParameterSets = new EObjectContainmentEList.Resolving<ParameterSet>(
 				ParameterSet.class, this,
 				UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET);
 		}
@@ -593,9 +613,7 @@
 	 */
 	public ParameterSet getOwnedParameterSet(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedParameterSetLoop : for (Iterator i = getOwnedParameterSets()
-			.iterator(); i.hasNext();) {
-			ParameterSet ownedParameterSet = (ParameterSet) i.next();
+		ownedParameterSetLoop : for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedParameterSet.getName())
 				: name.equals(ownedParameterSet.getName())))
@@ -690,7 +708,7 @@
 	 * @generated
 	 */
 	public boolean validateParametersMatch(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return BehaviorOperations.validateParametersMatch(this, diagnostics,
 			context);
 	}
@@ -701,7 +719,7 @@
 	 * @generated
 	 */
 	public boolean validateFeatureOfContextClassifier(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return BehaviorOperations.validateFeatureOfContextClassifier(this,
 			diagnostics, context);
 	}
@@ -711,7 +729,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMustRealize(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMustRealize(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return BehaviorOperations.validateMustRealize(this, diagnostics,
 			context);
 	}
@@ -722,7 +741,7 @@
 	 * @generated
 	 */
 	public boolean validateMostOneBehaviour(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return BehaviorOperations.validateMostOneBehaviour(this, diagnostics,
 			context);
 	}
@@ -732,24 +751,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -764,8 +785,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -775,22 +796,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__SPECIFICATION :
 				if (specification != null)
 					msgs = ((InternalEObject) specification).eInverseRemove(
@@ -806,92 +828,93 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__PRECONDITION :
-				return ((InternalEList) getPreconditions()).basicRemove(
+				return ((InternalEList<?>) getPreconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__POSTCONDITION :
-				return ((InternalEList) getPostconditions()).basicRemove(
+				return ((InternalEList<?>) getPostconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIOR__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 		}
@@ -903,6 +926,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
@@ -1064,15 +1088,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__NAME :
 				setName((String) newValue);
@@ -1082,22 +1110,26 @@
 				return;
 			case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1113,7 +1145,8 @@
 				return;
 			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1123,107 +1156,129 @@
 				return;
 			case UMLPackage.BEHAVIOR__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.BEHAVIOR__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
@@ -1237,6 +1292,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
@@ -1380,6 +1436,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIOR__EANNOTATIONS :
@@ -1520,6 +1577,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1548,6 +1606,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR);
@@ -1578,6 +1637,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.BEHAVIOR__OWNED_PARAMETER)
@@ -1599,6 +1659,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
 			|| eIsSet(UMLPackage.BEHAVIOR__CONTEXT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioralFeatureImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioralFeatureImpl.java
index eb7cb88..0f996f1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioralFeatureImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioralFeatureImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioralFeatureImpl.java,v 1.20 2006/11/14 18:02:17 khussey Exp $
+ * $Id: BehavioralFeatureImpl.java,v 1.21 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -42,9 +42,14 @@
 import org.eclipse.uml2.uml.BehavioralFeature;
 import org.eclipse.uml2.uml.CallConcurrencyKind;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.ParameterSet;
 import org.eclipse.uml2.uml.RedefinableElement;
@@ -132,7 +137,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameters = null;
+	protected EList<Parameter> ownedParameters = null;
 
 	/**
 	 * The default value of the '{@link #isAbstract() <em>Is Abstract</em>}' attribute.
@@ -162,7 +167,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList methods = null;
+	protected EList<Behavior> methods = null;
 
 	/**
 	 * The default value of the '{@link #getConcurrency() <em>Concurrency</em>}' attribute.
@@ -192,7 +197,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList raisedExceptions = null;
+	protected EList<Type> raisedExceptions = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedParameterSets() <em>Owned Parameter Set</em>}' containment reference list.
@@ -202,7 +207,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameterSets = null;
+	protected EList<ParameterSet> ownedParameterSets = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -218,6 +223,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.BEHAVIORAL_FEATURE;
 	}
@@ -227,27 +233,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-						redefinedElements = new DerivedUnionEObjectEList(
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
 							RedefinableElement.class, this,
 							UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT,
 							null));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT, null);
 	}
 
@@ -267,9 +276,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -286,20 +293,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContextsGen() {
+	public EList<Classifier> getRedefinitionContextsGen() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class,
 							this,
 							UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
@@ -307,7 +318,7 @@
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT, null);
 	}
 
@@ -317,19 +328,23 @@
 	 */
 	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE};
 
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContext = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContext = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContext == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContext = new DerivedUnionEObjectEList(
+						redefinitionContext = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class,
 							this,
 							UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
@@ -337,7 +352,7 @@
 			}
 			return redefinitionContext;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -358,9 +373,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -404,24 +417,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeaturingClassifiersGen() {
+	public EList<Classifier> getFeaturingClassifiersGen() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
-						null));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class,
+							this,
+							UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
+							null));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER, null);
 	}
 
@@ -431,23 +450,29 @@
 	 */
 	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE};
 
-	public EList getFeaturingClassifiers() {
+	public EList<Classifier> getFeaturingClassifiers() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class,
+							this,
+							UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
+							FEATURING_CLASSIFIER_ESUBSETS));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
 			FEATURING_CLASSIFIER_ESUBSETS);
 	}
@@ -468,9 +493,7 @@
 	 */
 	public Classifier getFeaturingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		featuringClassifierLoop : for (Iterator i = getFeaturingClassifiers()
-			.iterator(); i.hasNext();) {
-			Classifier featuringClassifier = (Classifier) i.next();
+		featuringClassifierLoop : for (Classifier featuringClassifier : getFeaturingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(featuringClassifier))
 				continue featuringClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -528,25 +551,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER,
+			OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -554,9 +579,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameters() {
+	public EList<Parameter> getOwnedParameters() {
 		if (ownedParameters == null) {
-			ownedParameters = new EObjectContainmentEList.Resolving(
+			ownedParameters = new EObjectContainmentEList.Resolving<Parameter>(
 				Parameter.class, this,
 				UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER);
 		}
@@ -594,9 +619,7 @@
 	 */
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Iterator i = getOwnedParameters().iterator(); i
-			.hasNext();) {
-			Parameter ownedParameter = (Parameter) i.next();
+		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedParameter.getName())
 				: name.equals(ownedParameter.getName())))
@@ -643,10 +666,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMethods() {
+	public EList<Behavior> getMethods() {
 		if (methods == null) {
-			methods = new EObjectWithInverseResolvingEList(Behavior.class,
-				this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
+			methods = new EObjectWithInverseResolvingEList<Behavior>(
+				Behavior.class, this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
 				UMLPackage.BEHAVIOR__SPECIFICATION);
 		}
 		return methods;
@@ -667,8 +690,7 @@
 	 * @generated
 	 */
 	public Behavior getMethod(String name, boolean ignoreCase, EClass eClass) {
-		methodLoop : for (Iterator i = getMethods().iterator(); i.hasNext();) {
-			Behavior method = (Behavior) i.next();
+		methodLoop : for (Behavior method : getMethods()) {
 			if (eClass != null && !eClass.isInstance(method))
 				continue methodLoop;
 			if (name != null && !(ignoreCase
@@ -712,10 +734,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRaisedExceptions() {
+	public EList<Type> getRaisedExceptions() {
 		if (raisedExceptions == null) {
-			raisedExceptions = new EObjectResolvingEList(Type.class, this,
-				UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION);
+			raisedExceptions = new EObjectResolvingEList<Type>(Type.class,
+				this, UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION);
 		}
 		return raisedExceptions;
 	}
@@ -736,9 +758,7 @@
 	 */
 	public Type getRaisedException(String name, boolean ignoreCase,
 			EClass eClass) {
-		raisedExceptionLoop : for (Iterator i = getRaisedExceptions()
-			.iterator(); i.hasNext();) {
-			Type raisedException = (Type) i.next();
+		raisedExceptionLoop : for (Type raisedException : getRaisedExceptions()) {
 			if (eClass != null && !eClass.isInstance(raisedException))
 				continue raisedExceptionLoop;
 			if (name != null && !(ignoreCase
@@ -755,9 +775,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameterSets() {
+	public EList<ParameterSet> getOwnedParameterSets() {
 		if (ownedParameterSets == null) {
-			ownedParameterSets = new EObjectContainmentEList.Resolving(
+			ownedParameterSets = new EObjectContainmentEList.Resolving<ParameterSet>(
 				ParameterSet.class, this,
 				UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET);
 		}
@@ -793,9 +813,7 @@
 	 */
 	public ParameterSet getOwnedParameterSet(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedParameterSetLoop : for (Iterator i = getOwnedParameterSets()
-			.iterator(); i.hasNext();) {
-			ParameterSet ownedParameterSet = (ParameterSet) i.next();
+		ownedParameterSetLoop : for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedParameterSet.getName())
 				: name.equals(ownedParameterSet.getName())))
@@ -813,7 +831,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -824,7 +842,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -871,26 +889,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return ((InternalEList) getMethods()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -900,38 +921,39 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return ((InternalEList) getMethods()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getMethods()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -941,6 +963,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
@@ -1018,15 +1041,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__NAME :
 				setName((String) newValue);
@@ -1036,22 +1063,26 @@
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1061,25 +1092,28 @@
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT :
 				setIsAbstract(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
 				getMethods().clear();
-				getMethods().addAll((Collection) newValue);
+				getMethods().addAll((Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY :
 				setConcurrency((CallConcurrencyKind) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION :
 				getRaisedExceptions().clear();
-				getRaisedExceptions().addAll((Collection) newValue);
+				getRaisedExceptions().addAll(
+					(Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1090,6 +1124,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
@@ -1152,6 +1187,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
@@ -1221,7 +1257,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
@@ -1252,7 +1289,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
@@ -1283,6 +1321,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1340,6 +1379,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioredClassifierImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioredClassifierImpl.java
index 9748270..d10460f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioredClassifierImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BehavioredClassifierImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioredClassifierImpl.java,v 1.28 2006/11/14 18:02:16 khussey Exp $
+ * $Id: BehavioredClassifierImpl.java,v 1.29 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -41,17 +41,27 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioredClassifier;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.BehavioredClassifierOperations;
@@ -87,7 +97,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedBehaviors = null;
+	protected EList<Behavior> ownedBehaviors = null;
 
 	/**
 	 * The cached value of the '{@link #getClassifierBehavior() <em>Classifier Behavior</em>}' reference.
@@ -107,7 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList interfaceRealizations = null;
+	protected EList<InterfaceRealization> interfaceRealizations = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTriggers() <em>Owned Trigger</em>}' containment reference list.
@@ -117,7 +127,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedTriggers = null;
+	protected EList<Trigger> ownedTriggers = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -133,6 +143,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.BEHAVIORED_CLASSIFIER;
 	}
@@ -142,25 +153,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
 			OWNED_MEMBER_ESUBSETS);
 	}
 
@@ -169,23 +181,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -195,9 +209,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedBehaviors() {
+	public EList<Behavior> getOwnedBehaviors() {
 		if (ownedBehaviors == null) {
-			ownedBehaviors = new SubsetSupersetEObjectContainmentEList.Resolving(
+			ownedBehaviors = new SubsetSupersetEObjectContainmentEList.Resolving<Behavior>(
 				Behavior.class, this,
 				UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, null,
 				OWNED_BEHAVIOR_ESUBSETS);
@@ -234,9 +248,7 @@
 	 */
 	public Behavior getOwnedBehavior(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedBehaviorLoop : for (Iterator i = getOwnedBehaviors().iterator(); i
-			.hasNext();) {
-			Behavior ownedBehavior = (Behavior) i.next();
+		ownedBehaviorLoop : for (Behavior ownedBehavior : getOwnedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(ownedBehavior))
 				continue ownedBehaviorLoop;
 			if (name != null && !(ignoreCase
@@ -255,9 +267,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this,
 				UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY, null,
 				CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
@@ -310,7 +322,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newClassifierBehavior != null) {
-				EList ownedBehaviors = getOwnedBehaviors();
+				EList<Behavior> ownedBehaviors = getOwnedBehaviors();
 				if (!ownedBehaviors.contains(newClassifierBehavior)) {
 					ownedBehaviors.add(newClassifierBehavior);
 				}
@@ -336,9 +348,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInterfaceRealizations() {
+	public EList<InterfaceRealization> getInterfaceRealizations() {
 		if (interfaceRealizations == null) {
-			interfaceRealizations = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			interfaceRealizations = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<InterfaceRealization>(
 				InterfaceRealization.class, this,
 				UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION,
 				INTERFACE_REALIZATION_ESUPERSETS, null,
@@ -380,10 +392,7 @@
 	 */
 	public InterfaceRealization getInterfaceRealization(String name,
 			Interface contract, boolean ignoreCase, boolean createOnDemand) {
-		interfaceRealizationLoop : for (Iterator i = getInterfaceRealizations()
-			.iterator(); i.hasNext();) {
-			InterfaceRealization interfaceRealization = (InterfaceRealization) i
-				.next();
+		interfaceRealizationLoop : for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(interfaceRealization.getName())
 				: name.equals(interfaceRealization.getName())))
@@ -403,9 +412,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedTriggers() {
+	public EList<Trigger> getOwnedTriggers() {
 		if (ownedTriggers == null) {
-			ownedTriggers = new EObjectContainmentEList.Resolving(
+			ownedTriggers = new EObjectContainmentEList.Resolving<Trigger>(
 				Trigger.class, this,
 				UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TRIGGER);
 		}
@@ -441,9 +450,7 @@
 	 */
 	public Trigger getOwnedTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedTriggerLoop : for (Iterator i = getOwnedTriggers().iterator(); i
-			.hasNext();) {
-			Trigger ownedTrigger = (Trigger) i.next();
+		ownedTriggerLoop : for (Trigger ownedTrigger : getOwnedTriggers()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedTrigger.getName())
 				: name.equals(ownedTrigger.getName())))
@@ -461,7 +468,7 @@
 	 * @generated
 	 */
 	public boolean validateClassBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return BehavioredClassifierOperations.validateClassBehavior(this,
 			diagnostics, context);
 	}
@@ -471,10 +478,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImplementedInterfaces() {
+	public EList<Interface> getImplementedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.BEHAVIORED_CLASSIFIER.getEOperations().get(
 					1));
 			if (result == null) {
@@ -493,10 +501,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllImplementedInterfaces() {
+	public EList<Interface> getAllImplementedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.BEHAVIORED_CLASSIFIER.getEOperations().get(
 					2));
 			if (result == null) {
@@ -515,24 +524,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -547,8 +558,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -560,19 +571,20 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -582,64 +594,65 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -650,6 +663,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
@@ -765,15 +779,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME :
 				setName((String) newValue);
@@ -783,22 +801,26 @@
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -814,7 +836,8 @@
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -824,53 +847,63 @@
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -881,6 +914,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
@@ -979,6 +1013,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
@@ -1092,6 +1127,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR)
@@ -1156,6 +1192,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BroadcastSignalActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BroadcastSignalActionImpl.java
index de2bdca..69b15f1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BroadcastSignalActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/BroadcastSignalActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BroadcastSignalActionImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: BroadcastSignalActionImpl.java,v 1.15 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,13 +19,23 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.BroadcastSignalAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.StringExpression;
@@ -76,6 +86,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.BROADCAST_SIGNAL_ACTION;
 	}
@@ -129,7 +140,7 @@
 	 * @generated
 	 */
 	public boolean validateNumberAndOrder(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return BroadcastSignalActionOperations.validateNumberAndOrder(this,
 			diagnostics, context);
 	}
@@ -140,7 +151,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOrderingMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return BroadcastSignalActionOperations
 			.validateTypeOrderingMultiplicity(this, diagnostics, context);
 	}
@@ -150,6 +161,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
@@ -239,15 +251,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME :
 				setName((String) newValue);
@@ -257,7 +273,8 @@
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -273,39 +290,49 @@
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -322,6 +349,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
@@ -393,6 +421,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallActionImpl.java
index 5bcd087..5ee6d2a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: CallActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.CallAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.StringExpression;
@@ -95,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList results = null;
+	protected EList<OutputPin> results = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,6 +121,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CALL_ACTION;
 	}
@@ -121,21 +131,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this, UMLPackage.CALL_ACTION__OUTPUT,
+						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -172,10 +184,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getResults() {
+	public EList<OutputPin> getResults() {
 		if (results == null) {
-			results = new EObjectContainmentEList.Resolving(OutputPin.class,
-				this, UMLPackage.CALL_ACTION__RESULT);
+			results = new EObjectContainmentEList.Resolving<OutputPin>(
+				OutputPin.class, this, UMLPackage.CALL_ACTION__RESULT);
 		}
 		return results;
 	}
@@ -211,8 +223,7 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (Iterator i = getResults().iterator(); i.hasNext();) {
-			OutputPin result = (OutputPin) i.next();
+		resultLoop : for (OutputPin result : getResults()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(result.getName())
 				: name.equals(result.getName())))
@@ -232,7 +243,7 @@
 	 * @generated
 	 */
 	public boolean validateSynchronousCall(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CallActionOperations.validateSynchronousCall(this, diagnostics,
 			context);
 	}
@@ -243,7 +254,7 @@
 	 * @generated
 	 */
 	public boolean validateNumberAndOrder(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CallActionOperations.validateNumberAndOrder(this, diagnostics,
 			context);
 	}
@@ -254,7 +265,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOrderingMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CallActionOperations.validateTypeOrderingMultiplicity(this,
 			diagnostics, context);
 	}
@@ -264,18 +275,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
@@ -283,31 +295,31 @@
 			case UMLPackage.CALL_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CALL_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_ACTION__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -318,6 +330,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CALL_ACTION__EANNOTATIONS :
@@ -409,15 +422,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CALL_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__NAME :
 				setName((String) newValue);
@@ -427,7 +444,8 @@
 				return;
 			case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -443,39 +461,49 @@
 				return;
 			case UMLPackage.CALL_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.CALL_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -485,7 +513,7 @@
 				return;
 			case UMLPackage.CALL_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -496,6 +524,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_ACTION__EANNOTATIONS :
@@ -570,6 +599,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_ACTION__EANNOTATIONS :
@@ -649,6 +679,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -675,6 +706,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs() || eIsSet(UMLPackage.CALL_ACTION__RESULT);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallBehaviorActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallBehaviorActionImpl.java
index 7ec5b49..55a0605 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallBehaviorActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallBehaviorActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallBehaviorActionImpl.java,v 1.14 2006/11/14 18:02:18 khussey Exp $
+ * $Id: CallBehaviorActionImpl.java,v 1.15 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,25 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.CallBehaviorAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
+import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -76,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CALL_BEHAVIOR_ACTION;
 	}
@@ -130,7 +142,7 @@
 	 * @generated
 	 */
 	public boolean validateArgumentPinEqualParameter(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CallBehaviorActionOperations.validateArgumentPinEqualParameter(
 			this, diagnostics, context);
 	}
@@ -141,7 +153,7 @@
 	 * @generated
 	 */
 	public boolean validateResultPinEqualParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CallBehaviorActionOperations.validateResultPinEqualParameter(
 			this, diagnostics, context);
 	}
@@ -152,7 +164,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOrderingMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CallBehaviorActionOperations.validateTypeOrderingMultiplicity(
 			this, diagnostics, context);
 	}
@@ -162,6 +174,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
@@ -257,15 +270,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME :
 				setName((String) newValue);
@@ -275,7 +292,8 @@
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -291,39 +309,49 @@
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -333,7 +361,7 @@
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR :
 				setBehavior((Behavior) newValue);
@@ -347,6 +375,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
@@ -424,6 +453,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallEventImpl.java
index 9f7ce34..73fe5fc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallEventImpl.java
@@ -8,19 +8,22 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallEventImpl.java,v 1.11 2006/11/14 18:02:18 khussey Exp $
+ * $Id: CallEventImpl.java,v 1.12 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.CallEvent;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CALL_EVENT;
 	}
@@ -120,6 +124,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CALL_EVENT__EANNOTATIONS :
@@ -169,15 +174,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CALL_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CALL_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CALL_EVENT__NAME :
 				setName((String) newValue);
@@ -187,7 +196,8 @@
 				return;
 			case UMLPackage.CALL_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CALL_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -210,6 +220,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_EVENT__EANNOTATIONS :
@@ -248,6 +259,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallOperationActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallOperationActionImpl.java
index 484ecdf..3b7377e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallOperationActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CallOperationActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallOperationActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: CallOperationActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,9 +36,18 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.CallOperationAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -100,6 +110,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CALL_OPERATION_ACTION;
 	}
@@ -109,23 +120,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(InputPin.class,
-							this, UMLPackage.CALL_OPERATION_ACTION__INPUT,
+						inputs = new DerivedUnionEObjectEList<InputPin>(
+							InputPin.class, this,
+							UMLPackage.CALL_OPERATION_ACTION__INPUT,
 							INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.CALL_OPERATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -289,7 +302,7 @@
 	 * @generated
 	 */
 	public boolean validateArgumentPinEqualParameter(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CallOperationActionOperations.validateArgumentPinEqualParameter(
 			this, diagnostics, context);
 	}
@@ -300,7 +313,7 @@
 	 * @generated
 	 */
 	public boolean validateResultPinEqualParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CallOperationActionOperations.validateResultPinEqualParameter(
 			this, diagnostics, context);
 	}
@@ -311,7 +324,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeTargetPin(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CallOperationActionOperations.validateTypeTargetPin(this,
 			diagnostics, context);
 	}
@@ -322,7 +335,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOrderingMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CallOperationActionOperations.validateTypeOrderingMultiplicity(
 			this, diagnostics, context);
 	}
@@ -332,18 +345,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
@@ -351,31 +365,31 @@
 			case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
 				return basicSetTarget(null, msgs);
@@ -388,6 +402,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
@@ -487,15 +502,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__NAME :
 				setName((String) newValue);
@@ -505,7 +524,8 @@
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -521,39 +541,49 @@
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -563,7 +593,7 @@
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.CALL_OPERATION_ACTION__OPERATION :
 				setOperation((Operation) newValue);
@@ -580,6 +610,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
@@ -660,6 +691,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
@@ -755,6 +787,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.CALL_OPERATION_ACTION__TARGET);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CentralBufferNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CentralBufferNodeImpl.java
index b7a6f08..8447da2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CentralBufferNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CentralBufferNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CentralBufferNodeImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: CentralBufferNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CENTRAL_BUFFER_NODE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ChangeEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ChangeEventImpl.java
index 3faf5b1..235ca76 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ChangeEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ChangeEventImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ChangeEventImpl.java,v 1.18 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ChangeEventImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,6 +32,8 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.ChangeEvent;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -81,6 +84,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CHANGE_EVENT;
 	}
@@ -90,23 +94,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CHANGE_EVENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.CHANGE_EVENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CHANGE_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -223,18 +229,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
@@ -252,6 +259,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
@@ -301,15 +309,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CHANGE_EVENT__NAME :
 				setName((String) newValue);
@@ -319,7 +331,8 @@
 				return;
 			case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -342,6 +355,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
@@ -380,6 +394,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
@@ -433,6 +448,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassImpl.java
index cc25187..7e0fd20 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassImpl.java,v 1.37 2006/11/14 18:02:15 khussey Exp $
+ * $Id: ClassImpl.java,v 1.38 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -25,6 +24,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
@@ -48,25 +48,35 @@
 import org.eclipse.uml2.uml.BehavioredClassifier;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Extension;
 import org.eclipse.uml2.uml.Feature;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLFactory;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.BehavioredClassifierOperations;
@@ -113,7 +123,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedBehaviors = null;
+	protected EList<Behavior> ownedBehaviors = null;
 
 	/**
 	 * The cached value of the '{@link #getClassifierBehavior() <em>Classifier Behavior</em>}' reference.
@@ -133,7 +143,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList interfaceRealizations = null;
+	protected EList<InterfaceRealization> interfaceRealizations = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTriggers() <em>Owned Trigger</em>}' containment reference list.
@@ -143,7 +153,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedTriggers = null;
+	protected EList<Trigger> ownedTriggers = null;
 
 	/**
 	 * The cached value of the '{@link #getNestedClassifiers() <em>Nested Classifier</em>}' containment reference list.
@@ -153,7 +163,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nestedClassifiers = null;
+	protected EList<Classifier> nestedClassifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedOperations() <em>Owned Operation</em>}' containment reference list.
@@ -163,7 +173,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedOperations = null;
+	protected EList<Operation> ownedOperations = null;
 
 	/**
 	 * The default value of the '{@link #isActive() <em>Is Active</em>}' attribute.
@@ -193,7 +203,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedReceptions = null;
+	protected EList<Reception> ownedReceptions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -209,6 +219,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLASS;
 	}
@@ -218,24 +229,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -243,23 +255,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CLASS__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.CLASS__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CLASS__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -268,9 +281,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedBehaviors() {
+	public EList<Behavior> getOwnedBehaviors() {
 		if (ownedBehaviors == null) {
-			ownedBehaviors = new SubsetSupersetEObjectContainmentEList.Resolving(
+			ownedBehaviors = new SubsetSupersetEObjectContainmentEList.Resolving<Behavior>(
 				Behavior.class, this, UMLPackage.CLASS__OWNED_BEHAVIOR, null,
 				OWNED_BEHAVIOR_ESUBSETS);
 		}
@@ -306,9 +319,7 @@
 	 */
 	public Behavior getOwnedBehavior(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedBehaviorLoop : for (Iterator i = getOwnedBehaviors().iterator(); i
-			.hasNext();) {
-			Behavior ownedBehavior = (Behavior) i.next();
+		ownedBehaviorLoop : for (Behavior ownedBehavior : getOwnedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(ownedBehavior))
 				continue ownedBehaviorLoop;
 			if (name != null && !(ignoreCase
@@ -327,9 +338,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this, UMLPackage.CLASS__CLIENT_DEPENDENCY,
 				null, CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
 		}
@@ -381,7 +392,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newClassifierBehavior != null) {
-				EList ownedBehaviors = getOwnedBehaviors();
+				EList<Behavior> ownedBehaviors = getOwnedBehaviors();
 				if (!ownedBehaviors.contains(newClassifierBehavior)) {
 					ownedBehaviors.add(newClassifierBehavior);
 				}
@@ -407,9 +418,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInterfaceRealizations() {
+	public EList<InterfaceRealization> getInterfaceRealizations() {
 		if (interfaceRealizations == null) {
-			interfaceRealizations = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			interfaceRealizations = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<InterfaceRealization>(
 				InterfaceRealization.class, this,
 				UMLPackage.CLASS__INTERFACE_REALIZATION,
 				INTERFACE_REALIZATION_ESUPERSETS, null,
@@ -451,10 +462,7 @@
 	 */
 	public InterfaceRealization getInterfaceRealization(String name,
 			Interface contract, boolean ignoreCase, boolean createOnDemand) {
-		interfaceRealizationLoop : for (Iterator i = getInterfaceRealizations()
-			.iterator(); i.hasNext();) {
-			InterfaceRealization interfaceRealization = (InterfaceRealization) i
-				.next();
+		interfaceRealizationLoop : for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(interfaceRealization.getName())
 				: name.equals(interfaceRealization.getName())))
@@ -474,9 +482,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedTriggers() {
+	public EList<Trigger> getOwnedTriggers() {
 		if (ownedTriggers == null) {
-			ownedTriggers = new EObjectContainmentEList.Resolving(
+			ownedTriggers = new EObjectContainmentEList.Resolving<Trigger>(
 				Trigger.class, this, UMLPackage.CLASS__OWNED_TRIGGER);
 		}
 		return ownedTriggers;
@@ -511,9 +519,7 @@
 	 */
 	public Trigger getOwnedTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedTriggerLoop : for (Iterator i = getOwnedTriggers().iterator(); i
-			.hasNext();) {
-			Trigger ownedTrigger = (Trigger) i.next();
+		ownedTriggerLoop : for (Trigger ownedTrigger : getOwnedTriggers()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedTrigger.getName())
 				: name.equals(ownedTrigger.getName())))
@@ -530,22 +536,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.CLASS__FEATURE, FEATURE_ESUBSETS));
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.CLASS__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.CLASS__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -554,22 +562,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.CLASS__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.CLASS__ATTRIBUTE,
+						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.CLASS__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -578,9 +588,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedOperations() {
+	public EList<Operation> getOwnedOperations() {
 		if (ownedOperations == null) {
-			ownedOperations = new EObjectContainmentWithInverseEList.Resolving(
+			ownedOperations = new EObjectContainmentWithInverseEList.Resolving<Operation>(
 				Operation.class, this, UMLPackage.CLASS__OWNED_OPERATION,
 				UMLPackage.OPERATION__CLASS);
 		}
@@ -593,7 +603,7 @@
 	 * @generated
 	 */
 	public Operation createOwnedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
@@ -624,8 +634,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedOperation(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -635,28 +645,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedOperationLoop : for (Iterator i = getOwnedOperations().iterator(); i
-			.hasNext();) {
-			Operation ownedOperation = (Operation) i.next();
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedOperationLoop : for (Operation ownedOperation : getOwnedOperations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedOperation.getName())
 				: name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList ownedParameterList = ownedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -679,9 +687,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNestedClassifiers() {
+	public EList<Classifier> getNestedClassifiers() {
 		if (nestedClassifiers == null) {
-			nestedClassifiers = new EObjectContainmentEList.Resolving(
+			nestedClassifiers = new EObjectContainmentEList.Resolving<Classifier>(
 				Classifier.class, this, UMLPackage.CLASS__NESTED_CLASSIFIER);
 		}
 		return nestedClassifiers;
@@ -716,9 +724,7 @@
 	 */
 	public Classifier getNestedClassifier(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedClassifierLoop : for (Iterator i = getNestedClassifiers()
-			.iterator(); i.hasNext();) {
-			Classifier nestedClassifier = (Classifier) i.next();
+		nestedClassifierLoop : for (Classifier nestedClassifier : getNestedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(nestedClassifier))
 				continue nestedClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -733,35 +739,40 @@
 	}
 
 	protected static class SuperClassEList
-			extends DerivedSubsetEObjectEList {
+			extends DerivedSubsetEObjectEList<Object> {
 
-		protected SuperClassEList(Class dataClass, InternalEObject owner,
+		protected SuperClassEList(Class<?> dataClass, InternalEObject owner,
 				int featureID, int[] sourceFeatureIDs) {
 			super(dataClass, owner, featureID, sourceFeatureIDs);
 		}
 
-		public List basicList() {
+		@Override
+		public List<Object> basicList() {
 			return new SuperClassEList(dataClass, owner, featureID,
 				sourceFeatureIDs) {
 
-				public ListIterator listIterator(int index) {
+				@Override
+				public ListIterator<Object> listIterator(int index) {
 					return basicListIterator(index);
 				}
 			};
 		}
 
+		@Override
 		protected boolean isIncluded(EStructuralFeature feature) {
 			return false;
 		}
 
+		@Override
 		protected Object derive(Object object) {
 			return ((Generalization) object).getGeneral();
 		}
 
-		protected Object validate(int index, Object object) {
+		@Override
+		protected Generalization validate(int index, Object object) {
 			Generalization generalization = UMLFactory.eINSTANCE
 				.createGeneralization();
-			generalization.setGeneral((org.eclipse.uml2.uml.Class) super
+			generalization.setGeneral((Classifier) super
 				.validate(index, object));
 			return generalization;
 		}
@@ -779,23 +790,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getSuperClasses() {
+	@SuppressWarnings("unchecked")
+	public EList<org.eclipse.uml2.uml.Class> getSuperClasses() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList superClasses = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASS__SUPER_CLASS);
+			EList<org.eclipse.uml2.uml.Class> superClasses = (EList<org.eclipse.uml2.uml.Class>) cache
+				.get(eResource, this, UMLPackage.Literals.CLASS__SUPER_CLASS);
 			if (superClasses == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.CLASS__SUPER_CLASS,
-					superClasses = new SuperClassEList(
-						org.eclipse.uml2.uml.Class.class, this,
-						UMLPackage.CLASS__SUPER_CLASS, SUPER_CLASS_ESUPERSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.CLASS__SUPER_CLASS,
+						superClasses = (EList<org.eclipse.uml2.uml.Class>) ((EList<?>) new SuperClassEList(
+							org.eclipse.uml2.uml.Class.class, this,
+							UMLPackage.CLASS__SUPER_CLASS,
+							SUPER_CLASS_ESUPERSETS)));
 			}
 			return superClasses;
 		}
-		return new SuperClassEList(org.eclipse.uml2.uml.Class.class, this,
-			UMLPackage.CLASS__SUPER_CLASS, SUPER_CLASS_ESUPERSETS);
+		return (EList<org.eclipse.uml2.uml.Class>) ((EList<?>) new SuperClassEList(
+			org.eclipse.uml2.uml.Class.class, this,
+			UMLPackage.CLASS__SUPER_CLASS, SUPER_CLASS_ESUPERSETS));
 	}
 
 	/**
@@ -814,10 +831,7 @@
 	 */
 	public org.eclipse.uml2.uml.Class getSuperClass(String name,
 			boolean ignoreCase, EClass eClass) {
-		superClassLoop : for (Iterator i = getSuperClasses().iterator(); i
-			.hasNext();) {
-			org.eclipse.uml2.uml.Class superClass = (org.eclipse.uml2.uml.Class) i
-				.next();
+		superClassLoop : for (org.eclipse.uml2.uml.Class superClass : getSuperClasses()) {
 			if (eClass != null && !eClass.isInstance(superClass))
 				continue superClassLoop;
 			if (name != null && !(ignoreCase
@@ -870,9 +884,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedReceptions() {
+	public EList<Reception> getOwnedReceptions() {
 		if (ownedReceptions == null) {
-			ownedReceptions = new EObjectContainmentEList.Resolving(
+			ownedReceptions = new EObjectContainmentEList.Resolving<Reception>(
 				Reception.class, this, UMLPackage.CLASS__OWNED_RECEPTION);
 		}
 		return ownedReceptions;
@@ -884,7 +898,7 @@
 	 * @generated
 	 */
 	public Reception createOwnedReception(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Reception newOwnedReception = (Reception) create(UMLPackage.Literals.RECEPTION);
 		getOwnedReceptions().add(newOwnedReception);
 		if (name != null)
@@ -915,8 +929,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Reception getOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedReception(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -926,28 +940,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedReceptionLoop : for (Iterator i = getOwnedReceptions().iterator(); i
-			.hasNext();) {
-			Reception ownedReception = (Reception) i.next();
+	public Reception getOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedReceptionLoop : for (Reception ownedReception : getOwnedReceptions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedReception.getName())
 				: name.equals(ownedReception.getName())))
 				continue ownedReceptionLoop;
-			EList ownedParameterList = ownedReception.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedReception
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedReceptionLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -970,11 +982,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtensions() {
+	public EList<Extension> getExtensions() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Extension> result = (EList<Extension>) cache.get(this,
 				UMLPackage.Literals.CLASS__EXTENSION);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASS__EXTENSION,
@@ -1000,9 +1013,7 @@
 	 * @generated
 	 */
 	public Extension getExtension(String name, boolean ignoreCase) {
-		extensionLoop : for (Iterator i = getExtensions().iterator(); i
-			.hasNext();) {
-			Extension extension = (Extension) i.next();
+		extensionLoop : for (Extension extension : getExtensions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(extension.getName())
 				: name.equals(extension.getName())))
@@ -1017,9 +1028,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this, UMLPackage.CLASS__OWNED_ATTRIBUTE);
 		}
 		return ownedAttributes;
@@ -1030,6 +1041,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property createOwnedAttribute(String name, Type type, EClass eClass) {
 		Property newOwnedAttribute = (Property) create(eClass);
 		getOwnedAttributes().add(newOwnedAttribute);
@@ -1045,6 +1057,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property createOwnedAttribute(String name, Type type) {
 		return createOwnedAttribute(name, type, UMLPackage.Literals.PROPERTY);
 	}
@@ -1054,6 +1067,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property getOwnedAttribute(String name, Type type) {
 		return getOwnedAttribute(name, type, false, null, false);
 	}
@@ -1063,11 +1077,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -1134,7 +1147,7 @@
 	 * @generated
 	 */
 	public boolean validateClassBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return BehavioredClassifierOperations.validateClassBehavior(this,
 			diagnostics, context);
 	}
@@ -1144,10 +1157,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImplementedInterfaces() {
+	public EList<Interface> getImplementedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.BEHAVIORED_CLASSIFIER.getEOperations().get(
 					1));
 			if (result == null) {
@@ -1166,10 +1180,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllImplementedInterfaces() {
+	public EList<Interface> getAllImplementedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.BEHAVIORED_CLASSIFIER.getEOperations().get(
 					2));
 			if (result == null) {
@@ -1188,7 +1203,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validatePassiveClass(DiagnosticChain diagnostics, Map context) {
+	public boolean validatePassiveClass(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ClassOperations.validatePassiveClass(this, diagnostics, context);
 	}
 
@@ -1197,8 +1213,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType) {
+	public Operation createOwnedOperation(String name,
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			Type returnType) {
 		return ClassOperations.createOwnedOperation(this, name, parameterNames,
 			parameterTypes, returnType);
 	}
@@ -1217,7 +1234,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList inherit(EList inhs) {
+	public EList<NamedElement> inherit(EList<NamedElement> inhs) {
 		return ClassOperations.inherit(this, inhs);
 	}
 
@@ -1226,24 +1243,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1258,8 +1277,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -1269,22 +1288,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.CLASS__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1294,79 +1314,80 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLASS__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.CLASS__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASS__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -1377,6 +1398,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
@@ -1516,15 +1538,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CLASS__NAME :
 				setName((String) newValue);
@@ -1534,22 +1560,26 @@
 				return;
 			case UMLPackage.CLASS__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CLASS__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.CLASS__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.CLASS__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CLASS__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1565,7 +1595,8 @@
 				return;
 			case UMLPackage.CLASS__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1575,84 +1606,101 @@
 				return;
 			case UMLPackage.CLASS__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.CLASS__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.CLASS__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.CLASS__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.CLASS__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.CLASS__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.CLASS__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.CLASS__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.CLASS__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.CLASS__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.CLASS__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.CLASS__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.CLASS__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.CLASS__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1663,6 +1711,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
@@ -1785,6 +1834,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASS__EANNOTATIONS :
@@ -1907,7 +1957,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.CLASS__OWNED_BEHAVIOR :
@@ -1930,7 +1981,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
@@ -1953,6 +2005,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1986,6 +2039,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers() || isSetOwnedAttributes()
 			|| eIsSet(UMLPackage.CLASS__OWNED_BEHAVIOR)
@@ -2048,6 +2102,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.CLASS__INTERFACE_REALIZATION);
@@ -2070,6 +2125,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.CLASS__OWNED_OPERATION)
@@ -2091,6 +2147,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes() || isSetOwnedAttributes();
 	}
@@ -2100,8 +2157,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGenerals() {
-		return getSuperClasses();
+	@Override
+	public EList<Classifier> getGenerals() {
+		@SuppressWarnings("unchecked")
+		EList<Classifier> superClass = (EList<Classifier>) ((EList<?>) getSuperClasses());
+		return superClass;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierImpl.java
index 706ac6b..01f19bb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassifierImpl.java,v 1.38 2006/11/17 15:48:50 khussey Exp $
+ * $Id: ClassifierImpl.java,v 1.39 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -49,14 +49,19 @@
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.ClassifierTemplateParameter;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
 import org.eclipse.uml2.uml.Generalization;
 import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.PackageableElement;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.Property;
@@ -163,7 +168,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -183,7 +188,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList collaborationUses = null;
+	protected EList<CollaborationUse> collaborationUses = null;
 
 	/**
 	 * The default value of the '{@link #isAbstract() <em>Is Abstract</em>}' attribute.
@@ -213,7 +218,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalizations = null;
+	protected EList<Generalization> generalizations = null;
 
 	/**
 	 * The cached value of the '{@link #getPowertypeExtents() <em>Powertype Extent</em>}' reference list.
@@ -223,7 +228,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList powertypeExtents = null;
+	protected EList<GeneralizationSet> powertypeExtents = null;
 
 	/**
 	 * The cached value of the '{@link #getRedefinedClassifiers() <em>Redefined Classifier</em>}' reference list.
@@ -233,7 +238,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedClassifiers = null;
+	protected EList<Classifier> redefinedClassifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getSubstitutions() <em>Substitution</em>}' containment reference list.
@@ -243,7 +248,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList substitutions = null;
+	protected EList<Substitution> substitutions = null;
 
 	/**
 	 * The cached value of the '{@link #getRepresentation() <em>Representation</em>}' reference.
@@ -263,7 +268,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedUseCases = null;
+	protected EList<UseCase> ownedUseCases = null;
 
 	/**
 	 * The cached value of the '{@link #getUseCases() <em>Use Case</em>}' reference list.
@@ -273,7 +278,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList useCases = null;
+	protected EList<UseCase> useCases = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -289,6 +294,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLASSIFIER;
 	}
@@ -298,24 +304,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.CLASSIFIER__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.CLASSIFIER__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.CLASSIFIER__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -336,9 +348,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -355,26 +365,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContextsGen() {
+	public EList<Classifier> getRedefinitionContextsGen() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class, this,
 							UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null);
 	}
 
@@ -384,26 +398,30 @@
 	 */
 	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{UMLPackage.CLASSIFIER__NAMESPACE};
 
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedEObjectEList(
+						redefinitionContexts = new DerivedEObjectEList<Classifier>(
 							Classifier.class, this,
 							UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
 							REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedEObjectEList(Classifier.class, this,
+		return new DerivedEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -424,9 +442,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -750,8 +766,8 @@
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newPackage != null)
-				msgs = ((InternalEList) newPackage.getOwnedTypes()).basicAdd(
-					this, msgs);
+				msgs = ((InternalEList<Type>) newPackage.getOwnedTypes())
+					.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newPackage,
 				UMLPackage.CLASSIFIER__PACKAGE, msgs);
 			if (msgs != null)
@@ -766,23 +782,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CLASSIFIER__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.CLASSIFIER__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -791,9 +809,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.CLASSIFIER__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -830,9 +848,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -987,24 +1003,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
-				cache
-					.put(eResource, this,
-						UMLPackage.Literals.CLASSIFIER__FEATURE,
-						features = new DerivedUnionEObjectEList(Feature.class,
-							this, UMLPackage.CLASSIFIER__FEATURE,
-							FEATURE_ESUBSETS));
+				cache.put(eResource, this,
+					UMLPackage.Literals.CLASSIFIER__FEATURE,
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.CLASSIFIER__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -1023,8 +1039,7 @@
 	 * @generated
 	 */
 	public Feature getFeature(String name, boolean ignoreCase, EClass eClass) {
-		featureLoop : for (Iterator i = getFeatures().iterator(); i.hasNext();) {
-			Feature feature = (Feature) i.next();
+		featureLoop : for (Feature feature : getFeatures()) {
 			if (eClass != null && !eClass.isInstance(feature))
 				continue featureLoop;
 			if (name != null && !(ignoreCase
@@ -1041,23 +1056,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS));
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -1065,25 +1082,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.CLASSIFIER__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -1091,22 +1109,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.CLASSIFIER__ATTRIBUTE, null));
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.CLASSIFIER__ATTRIBUTE,
+						null));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.CLASSIFIER__ATTRIBUTE, null);
 	}
 
@@ -1126,9 +1146,7 @@
 	 */
 	public Property getAttribute(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		attributeLoop : for (Iterator i = getAttributes().iterator(); i
-			.hasNext();) {
-			Property attribute = (Property) i.next();
+		attributeLoop : for (Property attribute : getAttributes()) {
 			if (eClass != null && !eClass.isInstance(attribute))
 				continue attributeLoop;
 			if (name != null && !(ignoreCase
@@ -1147,9 +1165,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this,
 				UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY, null,
 				CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
@@ -1162,9 +1180,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCollaborationUses() {
+	public EList<CollaborationUse> getCollaborationUses() {
 		if (collaborationUses == null) {
-			collaborationUses = new SubsetSupersetEObjectContainmentEList.Resolving(
+			collaborationUses = new SubsetSupersetEObjectContainmentEList.Resolving<CollaborationUse>(
 				CollaborationUse.class, this,
 				UMLPackage.CLASSIFIER__COLLABORATION_USE, null,
 				COLLABORATION_USE_ESUBSETS);
@@ -1201,9 +1219,7 @@
 	 */
 	public CollaborationUse getCollaborationUse(String name,
 			boolean ignoreCase, boolean createOnDemand) {
-		collaborationUseLoop : for (Iterator i = getCollaborationUses()
-			.iterator(); i.hasNext();) {
-			CollaborationUse collaborationUse = (CollaborationUse) i.next();
+		collaborationUseLoop : for (CollaborationUse collaborationUse : getCollaborationUses()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(collaborationUse.getName())
 				: name.equals(collaborationUse.getName())))
@@ -1248,9 +1264,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralizations() {
+	public EList<Generalization> getGeneralizations() {
 		if (generalizations == null) {
-			generalizations = new EObjectContainmentWithInverseEList.Resolving(
+			generalizations = new EObjectContainmentWithInverseEList.Resolving<Generalization>(
 				Generalization.class, this,
 				UMLPackage.CLASSIFIER__GENERALIZATION,
 				UMLPackage.GENERALIZATION__SPECIFIC);
@@ -1263,9 +1279,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPowertypeExtents() {
+	public EList<GeneralizationSet> getPowertypeExtents() {
 		if (powertypeExtents == null) {
-			powertypeExtents = new EObjectWithInverseResolvingEList(
+			powertypeExtents = new EObjectWithInverseResolvingEList<GeneralizationSet>(
 				GeneralizationSet.class, this,
 				UMLPackage.CLASSIFIER__POWERTYPE_EXTENT,
 				UMLPackage.GENERALIZATION_SET__POWERTYPE);
@@ -1288,9 +1304,7 @@
 	 * @generated
 	 */
 	public GeneralizationSet getPowertypeExtent(String name, boolean ignoreCase) {
-		powertypeExtentLoop : for (Iterator i = getPowertypeExtents()
-			.iterator(); i.hasNext();) {
-			GeneralizationSet powertypeExtent = (GeneralizationSet) i.next();
+		powertypeExtentLoop : for (GeneralizationSet powertypeExtent : getPowertypeExtents()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(powertypeExtent.getName())
 				: name.equals(powertypeExtent.getName())))
@@ -1305,11 +1319,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInheritedMembers() {
+	public EList<NamedElement> getInheritedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> result = (EList<NamedElement>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER);
 			if (result == null) {
 				cache.put(this,
@@ -1337,9 +1352,7 @@
 	 */
 	public NamedElement getInheritedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		inheritedMemberLoop : for (Iterator i = getInheritedMembers()
-			.iterator(); i.hasNext();) {
-			NamedElement inheritedMember = (NamedElement) i.next();
+		inheritedMemberLoop : for (NamedElement inheritedMember : getInheritedMembers()) {
 			if (eClass != null && !eClass.isInstance(inheritedMember))
 				continue inheritedMemberLoop;
 			if (name != null && !(ignoreCase
@@ -1356,10 +1369,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedClassifiers() {
+	public EList<Classifier> getRedefinedClassifiers() {
 		if (redefinedClassifiers == null) {
-			redefinedClassifiers = new EObjectResolvingEList(Classifier.class,
-				this, UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER);
+			redefinedClassifiers = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
+				UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER);
 		}
 		return redefinedClassifiers;
 	}
@@ -1380,9 +1394,7 @@
 	 */
 	public Classifier getRedefinedClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedClassifierLoop : for (Iterator i = getRedefinedClassifiers()
-			.iterator(); i.hasNext();) {
-			Classifier redefinedClassifier = (Classifier) i.next();
+		redefinedClassifierLoop : for (Classifier redefinedClassifier : getRedefinedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(redefinedClassifier))
 				continue redefinedClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -1399,11 +1411,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGenerals() {
+	public EList<Classifier> getGenerals() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER__GENERAL);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER__GENERAL,
@@ -1429,8 +1442,7 @@
 	 * @generated
 	 */
 	public Classifier getGeneral(String name, boolean ignoreCase, EClass eClass) {
-		generalLoop : for (Iterator i = getGenerals().iterator(); i.hasNext();) {
-			Classifier general = (Classifier) i.next();
+		generalLoop : for (Classifier general : getGenerals()) {
 			if (eClass != null && !eClass.isInstance(general))
 				continue generalLoop;
 			if (name != null && !(ignoreCase
@@ -1447,9 +1459,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedUseCases() {
+	public EList<UseCase> getOwnedUseCases() {
 		if (ownedUseCases == null) {
-			ownedUseCases = new EObjectContainmentEList.Resolving(
+			ownedUseCases = new EObjectContainmentEList.Resolving<UseCase>(
 				UseCase.class, this, UMLPackage.CLASSIFIER__OWNED_USE_CASE);
 		}
 		return ownedUseCases;
@@ -1484,9 +1496,7 @@
 	 */
 	public UseCase getOwnedUseCase(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedUseCaseLoop : for (Iterator i = getOwnedUseCases().iterator(); i
-			.hasNext();) {
-			UseCase ownedUseCase = (UseCase) i.next();
+		ownedUseCaseLoop : for (UseCase ownedUseCase : getOwnedUseCases()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedUseCase.getName())
 				: name.equals(ownedUseCase.getName())))
@@ -1503,9 +1513,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getUseCases() {
+	public EList<UseCase> getUseCases() {
 		if (useCases == null) {
-			useCases = new EObjectWithInverseResolvingEList.ManyInverse(
+			useCases = new EObjectWithInverseResolvingEList.ManyInverse<UseCase>(
 				UseCase.class, this, UMLPackage.CLASSIFIER__USE_CASE,
 				UMLPackage.USE_CASE__SUBJECT);
 		}
@@ -1527,8 +1537,7 @@
 	 * @generated
 	 */
 	public UseCase getUseCase(String name, boolean ignoreCase) {
-		useCaseLoop : for (Iterator i = getUseCases().iterator(); i.hasNext();) {
-			UseCase useCase = (UseCase) i.next();
+		useCaseLoop : for (UseCase useCase : getUseCases()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(useCase.getName())
 				: name.equals(useCase.getName())))
@@ -1543,9 +1552,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubstitutions() {
+	public EList<Substitution> getSubstitutions() {
 		if (substitutions == null) {
-			substitutions = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			substitutions = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Substitution>(
 				Substitution.class, this, UMLPackage.CLASSIFIER__SUBSTITUTION,
 				SUBSTITUTION_ESUPERSETS, null,
 				UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER);
@@ -1584,9 +1593,7 @@
 	 */
 	public Substitution getSubstitution(String name, Classifier contract,
 			boolean ignoreCase, boolean createOnDemand) {
-		substitutionLoop : for (Iterator i = getSubstitutions().iterator(); i
-			.hasNext();) {
-			Substitution substitution = (Substitution) i.next();
+		substitutionLoop : for (Substitution substitution : getSubstitutions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(substitution.getName())
 				: name.equals(substitution.getName())))
@@ -1646,7 +1653,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newRepresentation != null) {
-				EList collaborationUses = getCollaborationUses();
+				EList<CollaborationUse> collaborationUses = getCollaborationUses();
 				if (!collaborationUses.contains(newRepresentation)) {
 					collaborationUses.add(newRepresentation);
 				}
@@ -1673,7 +1680,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -1684,7 +1691,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -1746,11 +1753,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAssociations() {
+	public EList<Association> getAssociations() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.TYPE
-				.getEOperations().get(1));
+			@SuppressWarnings("unchecked")
+			EList<Association> result = (EList<Association>) cache.get(this,
+				UMLPackage.Literals.TYPE.getEOperations().get(1));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TYPE.getEOperations()
 					.get(1), result = TypeOperations.getAssociations(this));
@@ -1765,12 +1773,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -1797,7 +1806,7 @@
 	 * @generated
 	 */
 	public boolean validateNoCyclesInGeneralization(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ClassifierOperations.validateNoCyclesInGeneralization(this,
 			diagnostics, context);
 	}
@@ -1808,7 +1817,7 @@
 	 * @generated
 	 */
 	public boolean validateSpecializeType(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ClassifierOperations.validateSpecializeType(this, diagnostics,
 			context);
 	}
@@ -1819,7 +1828,7 @@
 	 * @generated
 	 */
 	public boolean validateGeneralizationHierarchies(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ClassifierOperations.validateGeneralizationHierarchies(this,
 			diagnostics, context);
 	}
@@ -1830,7 +1839,7 @@
 	 * @generated
 	 */
 	public boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ClassifierOperations.validateMapsToGeneralizationSet(this,
 			diagnostics, context);
 	}
@@ -1864,9 +1873,7 @@
 	 */
 	public Generalization getGeneralization(Classifier general,
 			boolean createOnDemand) {
-		generalizationLoop : for (Iterator i = getGeneralizations().iterator(); i
-			.hasNext();) {
-			Generalization generalization = (Generalization) i.next();
+		generalizationLoop : for (Generalization generalization : getGeneralizations()) {
 			if (general != null && !general.equals(generalization.getGeneral()))
 				continue generalizationLoop;
 			return generalization;
@@ -1881,10 +1888,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllAttributes() {
+	public EList<Property> getAllAttributes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Property> result = (EList<Property>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(4));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -1901,10 +1909,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOperations() {
+	public EList<Operation> getOperations() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Operation> result = (EList<Operation>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(5));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -1920,10 +1929,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllOperations() {
+	public EList<Operation> getAllOperations() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Operation> result = (EList<Operation>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(6));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -1940,8 +1950,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOperation(String name, EList parameterNames,
-			EList parameterTypes) {
+	public Operation getOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes) {
 		return ClassifierOperations.getOperation(this, name, parameterNames,
 			parameterTypes);
 	}
@@ -1951,8 +1961,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOperation(String name, EList parameterNames,
-			EList parameterTypes, boolean ignoreCase) {
+	public Operation getOperation(String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, boolean ignoreCase) {
 		return ClassifierOperations.getOperation(this, name, parameterNames,
 			parameterTypes, ignoreCase);
 	}
@@ -1962,10 +1972,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getUsedInterfaces() {
+	public EList<Interface> getUsedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(9));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -1982,10 +1993,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllUsedInterfaces() {
+	public EList<Interface> getAllUsedInterfaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(10));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -2011,10 +2023,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allFeatures() {
+	public EList<Feature> allFeatures() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Feature> result = (EList<Feature>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(13));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -2030,10 +2043,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parents() {
+	public EList<Classifier> parents() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(14));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -2049,7 +2063,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList inheritableMembers(Classifier c) {
+	public EList<NamedElement> inheritableMembers(Classifier c) {
 		return ClassifierOperations.inheritableMembers(this, c);
 	}
 
@@ -2076,7 +2090,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList inherit(EList inhs) {
+	public EList<NamedElement> inherit(EList<NamedElement> inhs) {
 		return ClassifierOperations.inherit(this, inhs);
 	}
 
@@ -2085,10 +2099,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allParents() {
+	public EList<Classifier> allParents() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.CLASSIFIER.getEOperations().get(20));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.CLASSIFIER.getEOperations()
@@ -2104,24 +2119,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -2136,8 +2153,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -2147,16 +2164,17 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -2166,55 +2184,56 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -2225,6 +2244,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -2241,6 +2261,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
@@ -2346,15 +2367,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__NAME :
 				setName((String) newValue);
@@ -2364,22 +2389,26 @@
 				return;
 			case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -2395,7 +2424,8 @@
 				return;
 			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -2405,38 +2435,45 @@
 				return;
 			case UMLPackage.CLASSIFIER__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -2447,6 +2484,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
@@ -2533,6 +2571,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER__EANNOTATIONS :
@@ -2623,7 +2662,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.CLASSIFIER__IS_LEAF :
@@ -2678,7 +2718,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
@@ -2733,6 +2774,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -2799,6 +2841,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER);
@@ -2823,6 +2866,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.CLASSIFIER__PACKAGE);
 	}
@@ -2852,6 +2896,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.CLASSIFIER__TEMPLATE_BINDING)
@@ -2940,6 +2985,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers() || isSetFeatures()
 			|| eIsSet(UMLPackage.CLASSIFIER__INHERITED_MEMBER);
@@ -2950,6 +2996,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.CLASSIFIER__OWNED_USE_CASE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierTemplateParameterImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierTemplateParameterImpl.java
index 59aacea..c02acc1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierTemplateParameterImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClassifierTemplateParameterImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassifierTemplateParameterImpl.java,v 1.17 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ClassifierTemplateParameterImpl.java,v 1.18 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,6 +29,7 @@
 
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.ClassifierTemplateParameter;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -109,6 +111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER;
 	}
@@ -288,6 +291,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetParameteredElement(
 			ParameterableElement newParameteredElement, NotificationChain msgs) {
 
@@ -355,7 +359,7 @@
 	 * @generated
 	 */
 	public boolean validateHasConstrainingClassifier(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ClassifierTemplateParameterOperations
 			.validateHasConstrainingClassifier(this, diagnostics, context);
 	}
@@ -365,6 +369,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -418,15 +423,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
 				setSignature((TemplateSignature) newValue);
@@ -461,6 +470,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -502,6 +512,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -537,6 +548,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClauseImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClauseImpl.java
index 710d21c..7e96e62 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClauseImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClauseImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClauseImpl.java,v 1.12 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ClauseImpl.java,v 1.13 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,6 +33,7 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Clause;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ExecutableNode;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Type;
@@ -70,7 +71,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList tests = null;
+	protected EList<ExecutableNode> tests = null;
 
 	/**
 	 * The cached value of the '{@link #getBodies() <em>Body</em>}' reference list.
@@ -80,7 +81,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodies = null;
+	protected EList<ExecutableNode> bodies = null;
 
 	/**
 	 * The cached value of the '{@link #getPredecessorClauses() <em>Predecessor Clause</em>}' reference list.
@@ -90,7 +91,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList predecessorClauses = null;
+	protected EList<Clause> predecessorClauses = null;
 
 	/**
 	 * The cached value of the '{@link #getSuccessorClauses() <em>Successor Clause</em>}' reference list.
@@ -100,7 +101,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList successorClauses = null;
+	protected EList<Clause> successorClauses = null;
 
 	/**
 	 * The cached value of the '{@link #getDecider() <em>Decider</em>}' reference.
@@ -120,7 +121,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodyOutputs = null;
+	protected EList<OutputPin> bodyOutputs = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -136,6 +137,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLAUSE;
 	}
@@ -145,10 +147,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTests() {
+	public EList<ExecutableNode> getTests() {
 		if (tests == null) {
-			tests = new EObjectResolvingEList(ExecutableNode.class, this,
-				UMLPackage.CLAUSE__TEST);
+			tests = new EObjectResolvingEList<ExecutableNode>(
+				ExecutableNode.class, this, UMLPackage.CLAUSE__TEST);
 		}
 		return tests;
 	}
@@ -168,8 +170,7 @@
 	 * @generated
 	 */
 	public ExecutableNode getTest(String name, boolean ignoreCase, EClass eClass) {
-		testLoop : for (Iterator i = getTests().iterator(); i.hasNext();) {
-			ExecutableNode test = (ExecutableNode) i.next();
+		testLoop : for (ExecutableNode test : getTests()) {
 			if (eClass != null && !eClass.isInstance(test))
 				continue testLoop;
 			if (name != null && !(ignoreCase
@@ -186,10 +187,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodies() {
+	public EList<ExecutableNode> getBodies() {
 		if (bodies == null) {
-			bodies = new EObjectResolvingEList(ExecutableNode.class, this,
-				UMLPackage.CLAUSE__BODY);
+			bodies = new EObjectResolvingEList<ExecutableNode>(
+				ExecutableNode.class, this, UMLPackage.CLAUSE__BODY);
 		}
 		return bodies;
 	}
@@ -209,8 +210,7 @@
 	 * @generated
 	 */
 	public ExecutableNode getBody(String name, boolean ignoreCase, EClass eClass) {
-		bodyLoop : for (Iterator i = getBodies().iterator(); i.hasNext();) {
-			ExecutableNode body = (ExecutableNode) i.next();
+		bodyLoop : for (ExecutableNode body : getBodies()) {
 			if (eClass != null && !eClass.isInstance(body))
 				continue bodyLoop;
 			if (name != null && !(ignoreCase
@@ -227,9 +227,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPredecessorClauses() {
+	public EList<Clause> getPredecessorClauses() {
 		if (predecessorClauses == null) {
-			predecessorClauses = new EObjectWithInverseResolvingEList.ManyInverse(
+			predecessorClauses = new EObjectWithInverseResolvingEList.ManyInverse<Clause>(
 				Clause.class, this, UMLPackage.CLAUSE__PREDECESSOR_CLAUSE,
 				UMLPackage.CLAUSE__SUCCESSOR_CLAUSE);
 		}
@@ -241,9 +241,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuccessorClauses() {
+	public EList<Clause> getSuccessorClauses() {
 		if (successorClauses == null) {
-			successorClauses = new EObjectWithInverseResolvingEList.ManyInverse(
+			successorClauses = new EObjectWithInverseResolvingEList.ManyInverse<Clause>(
 				Clause.class, this, UMLPackage.CLAUSE__SUCCESSOR_CLAUSE,
 				UMLPackage.CLAUSE__PREDECESSOR_CLAUSE);
 		}
@@ -297,10 +297,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodyOutputs() {
+	public EList<OutputPin> getBodyOutputs() {
 		if (bodyOutputs == null) {
-			bodyOutputs = new EObjectResolvingEList(OutputPin.class, this,
-				UMLPackage.CLAUSE__BODY_OUTPUT);
+			bodyOutputs = new EObjectResolvingEList<OutputPin>(OutputPin.class,
+				this, UMLPackage.CLAUSE__BODY_OUTPUT);
 		}
 		return bodyOutputs;
 	}
@@ -320,9 +320,7 @@
 	 * @generated
 	 */
 	public OutputPin getBodyOutput(String name, Type type, boolean ignoreCase) {
-		bodyOutputLoop : for (Iterator i = getBodyOutputs().iterator(); i
-			.hasNext();) {
-			OutputPin bodyOutput = (OutputPin) i.next();
+		bodyOutputLoop : for (OutputPin bodyOutput : getBodyOutputs()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(bodyOutput.getName())
 				: name.equals(bodyOutput.getName())))
@@ -340,7 +338,7 @@
 	 * @generated
 	 */
 	public boolean validateDeciderOutput(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ClauseOperations.validateDeciderOutput(this, diagnostics,
 			context);
 	}
@@ -351,7 +349,7 @@
 	 * @generated
 	 */
 	public boolean validateBodyOutputPins(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ClauseOperations.validateBodyOutputPins(this, diagnostics,
 			context);
 	}
@@ -361,18 +359,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return ((InternalEList) getPredecessorClauses()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPredecessorClauses())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return ((InternalEList) getSuccessorClauses()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSuccessorClauses())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -382,20 +382,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return ((InternalEList) getPredecessorClauses()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getPredecessorClauses())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return ((InternalEList) getSuccessorClauses()).basicRemove(
+				return ((InternalEList<?>) getSuccessorClauses()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -406,6 +407,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
@@ -441,38 +443,47 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CLAUSE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CLAUSE__TEST :
 				getTests().clear();
-				getTests().addAll((Collection) newValue);
+				getTests().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 			case UMLPackage.CLAUSE__BODY :
 				getBodies().clear();
-				getBodies().addAll((Collection) newValue);
+				getBodies().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
 				getPredecessorClauses().clear();
-				getPredecessorClauses().addAll((Collection) newValue);
+				getPredecessorClauses().addAll(
+					(Collection<? extends Clause>) newValue);
 				return;
 			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
 				getSuccessorClauses().clear();
-				getSuccessorClauses().addAll((Collection) newValue);
+				getSuccessorClauses().addAll(
+					(Collection<? extends Clause>) newValue);
 				return;
 			case UMLPackage.CLAUSE__DECIDER :
 				setDecider((OutputPin) newValue);
 				return;
 			case UMLPackage.CLAUSE__BODY_OUTPUT :
 				getBodyOutputs().clear();
-				getBodyOutputs().addAll((Collection) newValue);
+				getBodyOutputs().addAll(
+					(Collection<? extends OutputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -483,6 +494,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
@@ -518,6 +530,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLAUSE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearAssociationActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearAssociationActionImpl.java
index 33cf6d8..42223f8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearAssociationActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearAssociationActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClearAssociationActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ClearAssociationActionImpl.java,v 1.23 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,9 +36,17 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.ClearAssociationAction;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -99,6 +108,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION;
 	}
@@ -108,22 +118,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -291,7 +303,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ClearAssociationActionOperations.validateSameType(this,
 			diagnostics, context);
 	}
@@ -301,7 +314,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ClearAssociationActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -311,18 +325,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
@@ -330,26 +345,26 @@
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 		}
@@ -361,6 +376,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
@@ -448,15 +464,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME :
 				setName((String) newValue);
@@ -466,7 +486,8 @@
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -482,35 +503,44 @@
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
 				setObject((InputPin) newValue);
@@ -527,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
@@ -595,6 +626,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
@@ -680,6 +712,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearStructuralFeatureActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearStructuralFeatureActionImpl.java
index 49cce44..ff14ab4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearStructuralFeatureActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearStructuralFeatureActionImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClearStructuralFeatureActionImpl.java,v 1.2 2005/11/23 20:01:13 khussey Exp $
+ * $Id: ClearStructuralFeatureActionImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearVariableActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearVariableActionImpl.java
index b99dec8..f4b3b70 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearVariableActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ClearVariableActionImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClearVariableActionImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: ClearVariableActionImpl.java,v 1.3 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CLEAR_VARIABLE_ACTION;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationImpl.java
index 55c20f6..2d03c19 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CollaborationImpl.java,v 1.26 2006/11/14 18:02:19 khussey Exp $
+ * $Id: CollaborationImpl.java,v 1.27 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,19 +35,32 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Collaboration;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
 import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredClassifier;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.StructuredClassifierOperations;
@@ -85,7 +98,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedConnectors() <em>Owned Connector</em>}' containment reference list.
@@ -95,7 +108,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedConnectors = null;
+	protected EList<Connector> ownedConnectors = null;
 
 	/**
 	 * The cached value of the '{@link #getCollaborationRoles() <em>Collaboration Role</em>}' reference list.
@@ -105,7 +118,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList collaborationRoles = null;
+	protected EList<ConnectableElement> collaborationRoles = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -121,6 +134,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COLLABORATION;
 	}
@@ -130,24 +144,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRoles() {
+	public EList<ConnectableElement> getRoles() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList roles = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
+			@SuppressWarnings("unchecked")
+			EList<ConnectableElement> roles = (EList<ConnectableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
 			if (roles == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE,
-					roles = new DerivedUnionEObjectEList(
+					roles = new DerivedUnionEObjectEList<ConnectableElement>(
 						ConnectableElement.class, this,
 						UMLPackage.COLLABORATION__ROLE, ROLE_ESUBSETS));
 			}
 			return roles;
 		}
-		return new DerivedUnionEObjectEList(ConnectableElement.class, this,
-			UMLPackage.COLLABORATION__ROLE, ROLE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ConnectableElement>(
+			ConnectableElement.class, this, UMLPackage.COLLABORATION__ROLE,
+			ROLE_ESUBSETS);
 	}
 
 	/**
@@ -166,8 +183,7 @@
 	 */
 	public ConnectableElement getRole(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		roleLoop : for (Iterator i = getRoles().iterator(); i.hasNext();) {
-			ConnectableElement role = (ConnectableElement) i.next();
+		roleLoop : for (ConnectableElement role : getRoles()) {
 			if (eClass != null && !eClass.isInstance(role))
 				continue roleLoop;
 			if (name != null && !(ignoreCase
@@ -186,25 +202,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.COLLABORATION__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.COLLABORATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.COLLABORATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -212,23 +229,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.COLLABORATION__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache
+					.put(eResource, this,
+						UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
+						attributes = new DerivedUnionEObjectEList<Property>(
+							Property.class, this,
+							UMLPackage.COLLABORATION__ATTRIBUTE,
+							ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.COLLABORATION__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -237,25 +257,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
-				cache
-					.put(eResource, this,
-						UMLPackage.Literals.NAMESPACE__MEMBER,
-						members = new DerivedUnionEObjectEList(
-							NamedElement.class, this,
-							UMLPackage.COLLABORATION__MEMBER, MEMBER_ESUBSETS));
+				cache.put(eResource, this,
+					UMLPackage.Literals.NAMESPACE__MEMBER,
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.COLLABORATION__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.COLLABORATION__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.COLLABORATION__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -263,23 +283,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.COLLABORATION__FEATURE,
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.COLLABORATION__FEATURE,
 						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.COLLABORATION__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -288,9 +309,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this, UMLPackage.COLLABORATION__OWNED_ATTRIBUTE);
 		}
 		return ownedAttributes;
@@ -336,9 +357,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -365,12 +384,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getParts() {
+	public EList<Property> getParts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList parts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
+			@SuppressWarnings("unchecked")
+			EList<Property> parts = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
 			if (parts == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART,
@@ -400,8 +420,7 @@
 	 */
 	public Property getPart(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		partLoop : for (Iterator i = getParts().iterator(); i.hasNext();) {
-			Property part = (Property) i.next();
+		partLoop : for (Property part : getParts()) {
 			if (eClass != null && !eClass.isInstance(part))
 				continue partLoop;
 			if (name != null && !(ignoreCase
@@ -420,9 +439,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedConnectors() {
+	public EList<Connector> getOwnedConnectors() {
 		if (ownedConnectors == null) {
-			ownedConnectors = new EObjectContainmentEList.Resolving(
+			ownedConnectors = new EObjectContainmentEList.Resolving<Connector>(
 				Connector.class, this,
 				UMLPackage.COLLABORATION__OWNED_CONNECTOR);
 		}
@@ -458,9 +477,7 @@
 	 */
 	public Connector getOwnedConnector(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedConnectorLoop : for (Iterator i = getOwnedConnectors().iterator(); i
-			.hasNext();) {
-			Connector ownedConnector = (Connector) i.next();
+		ownedConnectorLoop : for (Connector ownedConnector : getOwnedConnectors()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedConnector.getName())
 				: name.equals(ownedConnector.getName())))
@@ -477,9 +494,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCollaborationRoles() {
+	public EList<ConnectableElement> getCollaborationRoles() {
 		if (collaborationRoles == null) {
-			collaborationRoles = new EObjectResolvingEList(
+			collaborationRoles = new EObjectResolvingEList<ConnectableElement>(
 				ConnectableElement.class, this,
 				UMLPackage.COLLABORATION__COLLABORATION_ROLE);
 		}
@@ -502,10 +519,7 @@
 	 */
 	public ConnectableElement getCollaborationRole(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		collaborationRoleLoop : for (Iterator i = getCollaborationRoles()
-			.iterator(); i.hasNext();) {
-			ConnectableElement collaborationRole = (ConnectableElement) i
-				.next();
+		collaborationRoleLoop : for (ConnectableElement collaborationRole : getCollaborationRoles()) {
 			if (eClass != null && !eClass.isInstance(collaborationRole))
 				continue collaborationRoleLoop;
 			if (name != null && !(ignoreCase
@@ -525,7 +539,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicities(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StructuredClassifierOperations.validateMultiplicities(this,
 			diagnostics, context);
 	}
@@ -546,70 +560,71 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.COLLABORATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -620,6 +635,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION__EANNOTATIONS :
@@ -745,15 +761,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__NAME :
 				setName((String) newValue);
@@ -763,22 +783,26 @@
 				return;
 			case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -794,7 +818,8 @@
 				return;
 			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -804,65 +829,78 @@
 				return;
 			case UMLPackage.COLLABORATION__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.COLLABORATION__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.COLLABORATION__COLLABORATION_ROLE :
 				getCollaborationRoles().clear();
-				getCollaborationRoles().addAll((Collection) newValue);
+				getCollaborationRoles().addAll(
+					(Collection<? extends ConnectableElement>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -873,6 +911,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION__EANNOTATIONS :
@@ -980,6 +1019,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION__EANNOTATIONS :
@@ -1090,7 +1130,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == StructuredClassifier.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
@@ -1113,7 +1154,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == StructuredClassifier.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
@@ -1174,6 +1216,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.COLLABORATION__OWNED_ATTRIBUTE)
@@ -1195,6 +1238,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.COLLABORATION__OWNED_ATTRIBUTE);
@@ -1220,6 +1264,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers() || isSetRoles();
 	}
@@ -1241,6 +1286,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.COLLABORATION__OWNED_CONNECTOR);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationUseImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationUseImpl.java
index 125bd9e..b42a76d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationUseImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CollaborationUseImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CollaborationUseImpl.java,v 1.18 2006/11/14 18:02:17 khussey Exp $
+ * $Id: CollaborationUseImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -38,6 +38,7 @@
 
 import org.eclipse.uml2.uml.Collaboration;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.StringExpression;
@@ -83,7 +84,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList roleBindings = null;
+	protected EList<Dependency> roleBindings = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -99,6 +100,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COLLABORATION_USE;
 	}
@@ -108,23 +110,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.COLLABORATION_USE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.COLLABORATION_USE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.COLLABORATION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -175,9 +179,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRoleBindings() {
+	public EList<Dependency> getRoleBindings() {
 		if (roleBindings == null) {
-			roleBindings = new EObjectContainmentEList.Resolving(
+			roleBindings = new EObjectContainmentEList.Resolving<Dependency>(
 				Dependency.class, this,
 				UMLPackage.COLLABORATION_USE__ROLE_BINDING);
 		}
@@ -222,9 +226,7 @@
 	 */
 	public Dependency getRoleBinding(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		roleBindingLoop : for (Iterator i = getRoleBindings().iterator(); i
-			.hasNext();) {
-			Dependency roleBinding = (Dependency) i.next();
+		roleBindingLoop : for (Dependency roleBinding : getRoleBindings()) {
 			if (eClass != null && !eClass.isInstance(roleBinding))
 				continue roleBindingLoop;
 			if (name != null && !(ignoreCase
@@ -244,7 +246,7 @@
 	 * @generated
 	 */
 	public boolean validateClientElements(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CollaborationUseOperations.validateClientElements(this,
 			diagnostics, context);
 	}
@@ -254,7 +256,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEveryRole(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEveryRole(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CollaborationUseOperations.validateEveryRole(this, diagnostics,
 			context);
 	}
@@ -264,7 +267,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateConnectors(DiagnosticChain diagnostics, Map context) {
+	public boolean validateConnectors(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CollaborationUseOperations.validateConnectors(this, diagnostics,
 			context);
 	}
@@ -274,22 +278,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				return ((InternalEList) getRoleBindings()).basicRemove(
+				return ((InternalEList<?>) getRoleBindings()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -300,6 +305,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
@@ -343,15 +349,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COLLABORATION_USE__NAME :
 				setName((String) newValue);
@@ -361,7 +371,8 @@
 				return;
 			case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -371,7 +382,8 @@
 				return;
 			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
 				getRoleBindings().clear();
-				getRoleBindings().addAll((Collection) newValue);
+				getRoleBindings().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -382,6 +394,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
@@ -417,6 +430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
@@ -468,6 +482,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.COLLABORATION_USE__ROLE_BINDING);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CombinedFragmentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CombinedFragmentImpl.java
index 3624d0b..bdf2ea7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CombinedFragmentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CombinedFragmentImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CombinedFragmentImpl.java,v 1.19 2006/11/14 18:02:18 khussey Exp $
+ * $Id: CombinedFragmentImpl.java,v 1.20 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,11 +37,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.CombinedFragment;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Gate;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
 import org.eclipse.uml2.uml.InteractionOperatorKind;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -96,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList operands = null;
+	protected EList<InteractionOperand> operands = null;
 
 	/**
 	 * The cached value of the '{@link #getCfragmentGates() <em>Cfragment Gate</em>}' containment reference list.
@@ -106,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList cfragmentGates = null;
+	protected EList<Gate> cfragmentGates = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -122,6 +126,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COMBINED_FRAGMENT;
 	}
@@ -131,23 +136,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -184,9 +191,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOperands() {
+	public EList<InteractionOperand> getOperands() {
 		if (operands == null) {
-			operands = new EObjectContainmentEList.Resolving(
+			operands = new EObjectContainmentEList.Resolving<InteractionOperand>(
 				InteractionOperand.class, this,
 				UMLPackage.COMBINED_FRAGMENT__OPERAND);
 		}
@@ -222,8 +229,7 @@
 	 */
 	public InteractionOperand getOperand(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		operandLoop : for (Iterator i = getOperands().iterator(); i.hasNext();) {
-			InteractionOperand operand = (InteractionOperand) i.next();
+		operandLoop : for (InteractionOperand operand : getOperands()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(operand.getName())
 				: name.equals(operand.getName())))
@@ -240,10 +246,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCfragmentGates() {
+	public EList<Gate> getCfragmentGates() {
 		if (cfragmentGates == null) {
-			cfragmentGates = new EObjectContainmentEList.Resolving(Gate.class,
-				this, UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE);
+			cfragmentGates = new EObjectContainmentEList.Resolving<Gate>(
+				Gate.class, this, UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE);
 		}
 		return cfragmentGates;
 	}
@@ -277,9 +283,7 @@
 	 */
 	public Gate getCfragmentGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		cfragmentGateLoop : for (Iterator i = getCfragmentGates().iterator(); i
-			.hasNext();) {
-			Gate cfragmentGate = (Gate) i.next();
+		cfragmentGateLoop : for (Gate cfragmentGate : getCfragmentGates()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(cfragmentGate.getName())
 				: name.equals(cfragmentGate.getName())))
@@ -297,7 +301,7 @@
 	 * @generated
 	 */
 	public boolean validateOptLoopBreakNeg(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CombinedFragmentOperations.validateOptLoopBreakNeg(this,
 			diagnostics, context);
 	}
@@ -308,7 +312,7 @@
 	 * @generated
 	 */
 	public boolean validateMinintAndMaxint(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CombinedFragmentOperations.validateMinintAndMaxint(this,
 			diagnostics, context);
 	}
@@ -318,7 +322,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateBreak(DiagnosticChain diagnostics, Map context) {
+	public boolean validateBreak(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CombinedFragmentOperations.validateBreak(this, diagnostics,
 			context);
 	}
@@ -329,7 +334,7 @@
 	 * @generated
 	 */
 	public boolean validateConsiderAndIgnore(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CombinedFragmentOperations.validateConsiderAndIgnore(this,
 			diagnostics, context);
 	}
@@ -339,35 +344,36 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
 				return basicSetEnclosingOperand(null, msgs);
 			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				return ((InternalEList) getOperands()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				return ((InternalEList) getCfragmentGates()).basicRemove(
+				return ((InternalEList<?>) getCfragmentGates()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -378,6 +384,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
@@ -433,15 +440,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__NAME :
 				setName((String) newValue);
@@ -451,18 +462,20 @@
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -475,11 +488,13 @@
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
 				getOperands().clear();
-				getOperands().addAll((Collection) newValue);
+				getOperands().addAll(
+					(Collection<? extends InteractionOperand>) newValue);
 				return;
 			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
 				getCfragmentGates().clear();
-				getCfragmentGates().addAll((Collection) newValue);
+				getCfragmentGates().addAll(
+					(Collection<? extends Gate>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -490,6 +505,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
@@ -540,6 +556,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
@@ -588,6 +605,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -619,6 +637,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.COMBINED_FRAGMENT__OPERAND)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommentImpl.java
index 95358e0..6eadfd7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommentImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CommentImpl.java,v 1.10 2006/11/14 18:02:20 khussey Exp $
+ * $Id: CommentImpl.java,v 1.11 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -17,6 +17,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
@@ -81,7 +82,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList annotatedElements = null;
+	protected EList<Element> annotatedElements = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -97,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COMMENT;
 	}
@@ -156,10 +158,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAnnotatedElements() {
+	public EList<Element> getAnnotatedElements() {
 		if (annotatedElements == null) {
-			annotatedElements = new EObjectResolvingEList(Element.class, this,
-				UMLPackage.COMMENT__ANNOTATED_ELEMENT);
+			annotatedElements = new EObjectResolvingEList<Element>(
+				Element.class, this, UMLPackage.COMMENT__ANNOTATED_ELEMENT);
 		}
 		return annotatedElements;
 	}
@@ -169,6 +171,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COMMENT__EANNOTATIONS :
@@ -194,22 +197,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COMMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COMMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COMMENT__BODY :
 				setBody((String) newValue);
 				return;
 			case UMLPackage.COMMENT__ANNOTATED_ELEMENT :
 				getAnnotatedElements().clear();
-				getAnnotatedElements().addAll((Collection) newValue);
+				getAnnotatedElements().addAll(
+					(Collection<? extends Element>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -220,6 +228,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMMENT__EANNOTATIONS :
@@ -243,6 +252,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMMENT__EANNOTATIONS :
@@ -267,6 +277,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommunicationPathImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommunicationPathImpl.java
index 9c3738e..5f8ae52 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommunicationPathImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CommunicationPathImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CommunicationPathImpl.java,v 1.2 2005/11/23 20:01:19 khussey Exp $
+ * $Id: CommunicationPathImpl.java,v 1.3 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COMMUNICATION_PATH;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CommunicationPathOperations.validateAssociationEnds(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentImpl.java
index 1e93441..a898522 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ComponentImpl.java,v 1.29 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ComponentImpl.java,v 1.30 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,18 +36,35 @@
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Component;
 import org.eclipse.uml2.uml.ComponentRealization;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Enumeration;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Interface;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.PrimitiveType;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.ComponentOperations;
@@ -103,7 +120,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList packagedElements = null;
+	protected EList<PackageableElement> packagedElements = null;
 
 	/**
 	 * The cached value of the '{@link #getRealizations() <em>Realization</em>}' containment reference list.
@@ -113,7 +130,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList realizations = null;
+	protected EList<ComponentRealization> realizations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -130,6 +147,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COMPONENT;
 	}
@@ -139,25 +157,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.COMPONENT__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.COMPONENT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.COMPONENT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -165,23 +184,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.COMPONENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.COMPONENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.COMPONENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -218,11 +239,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRequireds() {
+	public EList<Interface> getRequireds() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.COMPONENT__REQUIRED);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.COMPONENT__REQUIRED,
@@ -248,8 +270,7 @@
 	 * @generated
 	 */
 	public Interface getRequired(String name, boolean ignoreCase) {
-		requiredLoop : for (Iterator i = getRequireds().iterator(); i.hasNext();) {
-			Interface required = (Interface) i.next();
+		requiredLoop : for (Interface required : getRequireds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(required.getName())
 				: name.equals(required.getName())))
@@ -264,11 +285,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getProvideds() {
+	public EList<Interface> getProvideds() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.COMPONENT__PROVIDED);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.COMPONENT__PROVIDED,
@@ -294,8 +316,7 @@
 	 * @generated
 	 */
 	public Interface getProvided(String name, boolean ignoreCase) {
-		providedLoop : for (Iterator i = getProvideds().iterator(); i.hasNext();) {
-			Interface provided = (Interface) i.next();
+		providedLoop : for (Interface provided : getProvideds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(provided.getName())
 				: name.equals(provided.getName())))
@@ -310,9 +331,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackagedElements() {
+	public EList<PackageableElement> getPackagedElements() {
 		if (packagedElements == null) {
-			packagedElements = new EObjectContainmentEList.Resolving(
+			packagedElements = new EObjectContainmentEList.Resolving<PackageableElement>(
 				PackageableElement.class, this,
 				UMLPackage.COMPONENT__PACKAGED_ELEMENT);
 		}
@@ -348,9 +369,7 @@
 	 */
 	public PackageableElement getPackagedElement(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		packagedElementLoop : for (Iterator i = getPackagedElements()
-			.iterator(); i.hasNext();) {
-			PackageableElement packagedElement = (PackageableElement) i.next();
+		packagedElementLoop : for (PackageableElement packagedElement : getPackagedElements()) {
 			if (eClass != null && !eClass.isInstance(packagedElement))
 				continue packagedElementLoop;
 			if (name != null && !(ignoreCase
@@ -369,9 +388,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRealizations() {
+	public EList<ComponentRealization> getRealizations() {
 		if (realizations == null) {
-			realizations = new EObjectContainmentWithInverseEList.Resolving(
+			realizations = new EObjectContainmentWithInverseEList.Resolving<ComponentRealization>(
 				ComponentRealization.class, this,
 				UMLPackage.COMPONENT__REALIZATION,
 				UMLPackage.COMPONENT_REALIZATION__ABSTRACTION);
@@ -408,9 +427,7 @@
 	 */
 	public ComponentRealization getRealization(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		realizationLoop : for (Iterator i = getRealizations().iterator(); i
-			.hasNext();) {
-			ComponentRealization realization = (ComponentRealization) i.next();
+		realizationLoop : for (ComponentRealization realization : getRealizations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(realization.getName())
 				: name.equals(realization.getName())))
@@ -464,7 +481,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList realizedInterfaces(Classifier classifier) {
+	public EList<Interface> realizedInterfaces(Classifier classifier) {
 		return ComponentOperations.realizedInterfaces(this, classifier);
 	}
 
@@ -473,7 +490,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList usedInterfaces(Classifier classifier) {
+	public EList<Interface> usedInterfaces(Classifier classifier) {
 		return ComponentOperations.usedInterfaces(this, classifier);
 	}
 
@@ -482,24 +499,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -514,8 +533,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -525,25 +544,26 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.COMPONENT__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT__REALIZATION :
-				return ((InternalEList) getRealizations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRealizations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -553,85 +573,86 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COMPONENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.COMPONENT__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				return ((InternalEList) getPackagedElements()).basicRemove(
+				return ((InternalEList<?>) getPackagedElements()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT__REALIZATION :
-				return ((InternalEList) getRealizations()).basicRemove(
+				return ((InternalEList<?>) getRealizations()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -642,6 +663,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
@@ -793,15 +815,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COMPONENT__NAME :
 				setName((String) newValue);
@@ -811,22 +837,26 @@
 				return;
 			case UMLPackage.COMPONENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.COMPONENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.COMPONENT__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -842,7 +872,8 @@
 				return;
 			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -852,95 +883,114 @@
 				return;
 			case UMLPackage.COMPONENT__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.COMPONENT__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.COMPONENT__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.COMPONENT__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.COMPONENT__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.COMPONENT__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.COMPONENT__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.COMPONENT__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.COMPONENT__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.COMPONENT__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED :
 				setIsIndirectlyInstantiated(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
 				getPackagedElements().clear();
-				getPackagedElements().addAll((Collection) newValue);
+				getPackagedElements().addAll(
+					(Collection<? extends PackageableElement>) newValue);
 				return;
 			case UMLPackage.COMPONENT__REALIZATION :
 				getRealizations().clear();
-				getRealizations().addAll((Collection) newValue);
+				getRealizations().addAll(
+					(Collection<? extends ComponentRealization>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -951,6 +1001,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
@@ -1082,6 +1133,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT__EANNOTATIONS :
@@ -1214,6 +1266,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1249,6 +1302,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.COMPONENT__PACKAGED_ELEMENT);
@@ -1281,6 +1335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.COMPONENT__REALIZATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentRealizationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentRealizationImpl.java
index 6ddfd8e..5b8e85b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentRealizationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ComponentRealizationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ComponentRealizationImpl.java,v 1.15 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ComponentRealizationImpl.java,v 1.16 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,8 +33,10 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Component;
 import org.eclipse.uml2.uml.ComponentRealization;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.OpaqueExpression;
@@ -87,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.COMPONENT_REALIZATION;
 	}
@@ -108,9 +112,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClients() {
+	public EList<NamedElement> getClients() {
 		if (clients == null) {
-			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<NamedElement>(
 				NamedElement.class, this,
 				UMLPackage.COMPONENT_REALIZATION__CLIENT, null,
 				CLIENT_ESUBSETS, UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY);
@@ -133,9 +137,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new SubsetSupersetEObjectResolvingEList(
+			suppliers = new SubsetSupersetEObjectResolvingEList<NamedElement>(
 				NamedElement.class, this,
 				UMLPackage.COMPONENT_REALIZATION__SUPPLIER, null,
 				SUPPLIER_ESUBSETS);
@@ -188,7 +192,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newAbstraction != null) {
-				EList clients = getClients();
+				EList<NamedElement> clients = getClients();
 				if (!clients.contains(newAbstraction)) {
 					clients.add(newAbstraction);
 				}
@@ -270,7 +274,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newRealizingClassifier != null) {
-				EList suppliers = getSuppliers();
+				EList<NamedElement> suppliers = getSuppliers();
 				if (!suppliers.contains(newRealizingClassifier)) {
 					suppliers.add(newRealizingClassifier);
 				}
@@ -283,15 +287,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -306,7 +312,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				return ((InternalEList) getClients()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClients())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -320,18 +327,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
@@ -339,7 +347,7 @@
 			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
 				return basicSetMapping(null, msgs);
@@ -354,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -373,6 +382,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
@@ -440,15 +450,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__NAME :
 				setName((String) newValue);
@@ -458,7 +472,8 @@
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -471,11 +486,13 @@
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
 				setMapping((OpaqueExpression) newValue);
@@ -495,6 +512,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
@@ -545,6 +563,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
@@ -613,6 +632,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConditionalNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConditionalNodeImpl.java
index 3eba15e..3a92863 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConditionalNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConditionalNodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConditionalNodeImpl.java,v 1.21 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ConditionalNodeImpl.java,v 1.22 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,14 +37,25 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Clause;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConditionalNode;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.ConditionalNodeOperations;
@@ -119,7 +130,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList clauses = null;
+	protected EList<Clause> clauses = null;
 
 	/**
 	 * The cached value of the '{@link #getResults() <em>Result</em>}' containment reference list.
@@ -129,7 +140,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList results = null;
+	protected EList<OutputPin> results = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -145,6 +156,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONDITIONAL_NODE;
 	}
@@ -154,23 +166,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -179,22 +193,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.CONDITIONAL_NODE__OUTPUT,
-						OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.CONDITIONAL_NODE__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.CONDITIONAL_NODE__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -259,10 +274,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClauses() {
+	public EList<Clause> getClauses() {
 		if (clauses == null) {
-			clauses = new EObjectContainmentEList.Resolving(Clause.class, this,
-				UMLPackage.CONDITIONAL_NODE__CLAUSE);
+			clauses = new EObjectContainmentEList.Resolving<Clause>(
+				Clause.class, this, UMLPackage.CONDITIONAL_NODE__CLAUSE);
 		}
 		return clauses;
 	}
@@ -283,10 +298,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getResults() {
+	public EList<OutputPin> getResults() {
 		if (results == null) {
-			results = new EObjectContainmentEList.Resolving(OutputPin.class,
-				this, UMLPackage.CONDITIONAL_NODE__RESULT);
+			results = new EObjectContainmentEList.Resolving<OutputPin>(
+				OutputPin.class, this, UMLPackage.CONDITIONAL_NODE__RESULT);
 		}
 		return results;
 	}
@@ -322,8 +337,7 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (Iterator i = getResults().iterator(); i.hasNext();) {
-			OutputPin result = (OutputPin) i.next();
+		resultLoop : for (OutputPin result : getResults()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(result.getName())
 				: name.equals(result.getName())))
@@ -343,7 +357,7 @@
 	 * @generated
 	 */
 	public boolean validateResultNoIncoming(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConditionalNodeOperations.validateResultNoIncoming(this,
 			diagnostics, context);
 	}
@@ -353,18 +367,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
@@ -372,49 +387,51 @@
 			case UMLPackage.CONDITIONAL_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.CONDITIONAL_NODE__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				return ((InternalEList) getClauses()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClauses()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -425,6 +442,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
@@ -552,15 +570,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__NAME :
 				setName((String) newValue);
@@ -570,7 +592,8 @@
 				return;
 			case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -586,65 +609,80 @@
 				return;
 			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE :
 				setMustIsolate(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.CONDITIONAL_NODE__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE :
 				setIsDeterminate(((Boolean) newValue).booleanValue());
@@ -654,11 +692,11 @@
 				return;
 			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
 				getClauses().clear();
-				getClauses().addAll((Collection) newValue);
+				getClauses().addAll((Collection<? extends Clause>) newValue);
 				return;
 			case UMLPackage.CONDITIONAL_NODE__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -669,6 +707,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
@@ -767,6 +806,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
@@ -876,6 +916,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -916,6 +957,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.CONDITIONAL_NODE__CLAUSE);
@@ -936,6 +978,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.CONDITIONAL_NODE__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementImpl.java
index 92ee435..99ae3d7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectableElementImpl.java,v 1.16 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ConnectableElementImpl.java,v 1.17 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -29,9 +30,11 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
 import org.eclipse.uml2.uml.ConnectableElementTemplateParameter;
 import org.eclipse.uml2.uml.ConnectorEnd;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -80,7 +83,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ends = null;
+	protected EList<ConnectorEnd> ends = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -96,6 +99,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONNECTABLE_ELEMENT;
 	}
@@ -306,10 +310,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEnds() {
+	public EList<ConnectorEnd> getEnds() {
 		if (ends == null) {
-			ends = new EObjectWithInverseResolvingEList(ConnectorEnd.class,
-				this, UMLPackage.CONNECTABLE_ELEMENT__END,
+			ends = new EObjectWithInverseResolvingEList<ConnectorEnd>(
+				ConnectorEnd.class, this, UMLPackage.CONNECTABLE_ELEMENT__END,
 				UMLPackage.CONNECTOR_END__ROLE);
 		}
 		return ends;
@@ -338,15 +342,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -361,7 +367,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__END :
-				return ((InternalEList) getEnds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEnds())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -371,18 +378,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -390,7 +398,8 @@
 			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.CONNECTABLE_ELEMENT__END :
-				return ((InternalEList) getEnds()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -400,6 +409,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -416,6 +426,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
@@ -467,15 +478,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONNECTABLE_ELEMENT__NAME :
 				setName((String) newValue);
@@ -485,7 +500,8 @@
 				return;
 			case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -501,7 +517,7 @@
 				return;
 			case UMLPackage.CONNECTABLE_ELEMENT__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -512,6 +528,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
@@ -553,6 +570,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
@@ -595,7 +613,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -614,7 +633,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -647,6 +667,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementTemplateParameterImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementTemplateParameterImpl.java
index 62031d5..3622562 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementTemplateParameterImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectableElementTemplateParameterImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectableElementTemplateParameterImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ConnectableElementTemplateParameterImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -57,6 +57,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER;
 	}
@@ -115,6 +116,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetParameteredElement(
 			ParameterableElement newParameteredElement, NotificationChain msgs) {
 
@@ -183,6 +185,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -224,6 +227,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectionPointReferenceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectionPointReferenceImpl.java
index b28b285..4f86e26 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectionPointReferenceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectionPointReferenceImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectionPointReferenceImpl.java,v 1.16 2006/11/14 18:02:15 khussey Exp $
+ * $Id: ConnectionPointReferenceImpl.java,v 1.17 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,12 +32,15 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectionPointReference;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.Pseudostate;
 import org.eclipse.uml2.uml.Region;
 import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Transition;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -71,7 +74,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList entries = null;
+	protected EList<Pseudostate> entries = null;
 
 	/**
 	 * The cached value of the '{@link #getExits() <em>Exit</em>}' reference list.
@@ -81,7 +84,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList exits = null;
+	protected EList<Pseudostate> exits = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -97,6 +100,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONNECTION_POINT_REFERENCE;
 	}
@@ -118,10 +122,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEntries() {
+	public EList<Pseudostate> getEntries() {
 		if (entries == null) {
-			entries = new EObjectResolvingEList(Pseudostate.class, this,
-				UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY);
+			entries = new EObjectResolvingEList<Pseudostate>(Pseudostate.class,
+				this, UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY);
 		}
 		return entries;
 	}
@@ -141,8 +145,7 @@
 	 * @generated
 	 */
 	public Pseudostate getEntry(String name, boolean ignoreCase) {
-		entryLoop : for (Iterator i = getEntries().iterator(); i.hasNext();) {
-			Pseudostate entry = (Pseudostate) i.next();
+		entryLoop : for (Pseudostate entry : getEntries()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(entry.getName())
 				: name.equals(entry.getName())))
@@ -157,10 +160,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExits() {
+	public EList<Pseudostate> getExits() {
 		if (exits == null) {
-			exits = new EObjectResolvingEList(Pseudostate.class, this,
-				UMLPackage.CONNECTION_POINT_REFERENCE__EXIT);
+			exits = new EObjectResolvingEList<Pseudostate>(Pseudostate.class,
+				this, UMLPackage.CONNECTION_POINT_REFERENCE__EXIT);
 		}
 		return exits;
 	}
@@ -180,8 +183,7 @@
 	 * @generated
 	 */
 	public Pseudostate getExit(String name, boolean ignoreCase) {
-		exitLoop : for (Iterator i = getExits().iterator(); i.hasNext();) {
-			Pseudostate exit = (Pseudostate) i.next();
+		exitLoop : for (Pseudostate exit : getExits()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(exit.getName())
 				: name.equals(exit.getName())))
@@ -260,7 +262,7 @@
 	 * @generated
 	 */
 	public boolean validateEntryPseudostates(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectionPointReferenceOperations.validateEntryPseudostates(
 			this, diagnostics, context);
 	}
@@ -271,7 +273,7 @@
 	 * @generated
 	 */
 	public boolean validateExitPseudostates(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectionPointReferenceOperations.validateExitPseudostates(
 			this, diagnostics, context);
 	}
@@ -281,20 +283,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
 				if (eInternalContainer() != null)
@@ -313,26 +317,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
 				return basicSetContainer(null, msgs);
 			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
@@ -346,6 +351,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -364,6 +370,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
@@ -417,15 +424,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME :
 				setName((String) newValue);
@@ -435,29 +446,33 @@
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
 				setContainer((Region) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY :
 				getEntries().clear();
-				getEntries().addAll((Collection) newValue);
+				getEntries().addAll(
+					(Collection<? extends Pseudostate>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT :
 				getExits().clear();
-				getExits().addAll((Collection) newValue);
+				getExits().addAll((Collection<? extends Pseudostate>) newValue);
 				return;
 			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
 				setState((State) newValue);
@@ -471,6 +486,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
@@ -518,6 +534,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
@@ -578,6 +595,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorEndImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorEndImpl.java
index fbcd530..cb6643f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorEndImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorEndImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorEndImpl.java,v 1.14 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ConnectorEndImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -27,6 +28,7 @@
 
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
 import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.Property;
@@ -88,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONNECTOR_END;
 	}
@@ -238,7 +241,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConnectorEndOperations.validateMultiplicity(this, diagnostics,
 			context);
 	}
@@ -249,7 +253,7 @@
 	 * @generated
 	 */
 	public boolean validatePartWithPortEmpty(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectorEndOperations.validatePartWithPortEmpty(this,
 			diagnostics, context);
 	}
@@ -260,7 +264,7 @@
 	 * @generated
 	 */
 	public boolean validateRoleAndPartWithPort(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectorEndOperations.validateRoleAndPartWithPort(this,
 			diagnostics, context);
 	}
@@ -271,7 +275,7 @@
 	 * @generated
 	 */
 	public boolean validateSelfPartWithPort(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectorEndOperations.validateSelfPartWithPort(this,
 			diagnostics, context);
 	}
@@ -281,12 +285,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONNECTOR_END__ROLE :
 				if (role != null)
 					msgs = ((InternalEObject) role).eInverseRemove(this,
@@ -302,14 +308,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTOR_END__UPPER_VALUE :
 				return basicSetUpperValue(null, msgs);
@@ -326,6 +333,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
@@ -379,15 +387,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONNECTOR_END__IS_ORDERED :
 				setIsOrdered(((Boolean) newValue).booleanValue());
@@ -422,6 +434,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
@@ -463,6 +476,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorImpl.java
index 7f28463..9b2e933 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConnectorImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorImpl.java,v 1.15 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ConnectorImpl.java,v 1.16 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -39,9 +39,11 @@
 
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Connector;
 import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.ConnectorKind;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -91,7 +93,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedConnectors = null;
+	protected EList<Connector> redefinedConnectors = null;
 
 	/**
 	 * The cached value of the '{@link #getEnds() <em>End</em>}' containment reference list.
@@ -101,7 +103,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ends = null;
+	protected EList<ConnectorEnd> ends = null;
 
 	/**
 	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
@@ -140,7 +142,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList contracts = null;
+	protected EList<Behavior> contracts = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -156,6 +158,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONNECTOR;
 	}
@@ -165,24 +168,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.CONNECTOR__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.CONNECTOR__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.CONNECTOR__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -191,23 +200,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CONNECTOR__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.CONNECTOR__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CONNECTOR__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -258,10 +269,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedConnectors() {
+	public EList<Connector> getRedefinedConnectors() {
 		if (redefinedConnectors == null) {
-			redefinedConnectors = new EObjectResolvingEList(Connector.class,
-				this, UMLPackage.CONNECTOR__REDEFINED_CONNECTOR);
+			redefinedConnectors = new EObjectResolvingEList<Connector>(
+				Connector.class, this,
+				UMLPackage.CONNECTOR__REDEFINED_CONNECTOR);
 		}
 		return redefinedConnectors;
 	}
@@ -281,9 +293,7 @@
 	 * @generated
 	 */
 	public Connector getRedefinedConnector(String name, boolean ignoreCase) {
-		redefinedConnectorLoop : for (Iterator i = getRedefinedConnectors()
-			.iterator(); i.hasNext();) {
-			Connector redefinedConnector = (Connector) i.next();
+		redefinedConnectorLoop : for (Connector redefinedConnector : getRedefinedConnectors()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(redefinedConnector.getName())
 				: name.equals(redefinedConnector.getName())))
@@ -298,10 +308,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEnds() {
+	public EList<ConnectorEnd> getEnds() {
 		if (ends == null) {
-			ends = new EObjectContainmentEList.Resolving(ConnectorEnd.class,
-				this, UMLPackage.CONNECTOR__END);
+			ends = new EObjectContainmentEList.Resolving<ConnectorEnd>(
+				ConnectorEnd.class, this, UMLPackage.CONNECTOR__END);
 		}
 		return ends;
 	}
@@ -374,10 +384,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContracts() {
+	public EList<Behavior> getContracts() {
 		if (contracts == null) {
-			contracts = new EObjectResolvingEList(Behavior.class, this,
-				UMLPackage.CONNECTOR__CONTRACT);
+			contracts = new EObjectResolvingEList<Behavior>(Behavior.class,
+				this, UMLPackage.CONNECTOR__CONTRACT);
 		}
 		return contracts;
 	}
@@ -397,8 +407,7 @@
 	 * @generated
 	 */
 	public Behavior getContract(String name, boolean ignoreCase, EClass eClass) {
-		contractLoop : for (Iterator i = getContracts().iterator(); i.hasNext();) {
-			Behavior contract = (Behavior) i.next();
+		contractLoop : for (Behavior contract : getContracts()) {
 			if (eClass != null && !eClass.isInstance(contract))
 				continue contractLoop;
 			if (name != null && !(ignoreCase
@@ -415,7 +424,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTypes(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTypes(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConnectorOperations.validateTypes(this, diagnostics, context);
 	}
 
@@ -424,7 +434,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateCompatible(DiagnosticChain diagnostics, Map context) {
+	public boolean validateCompatible(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConnectorOperations.validateCompatible(this, diagnostics,
 			context);
 	}
@@ -434,7 +445,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateRoles(DiagnosticChain diagnostics, Map context) {
+	public boolean validateRoles(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConnectorOperations.validateRoles(this, diagnostics, context);
 	}
 
@@ -444,7 +456,7 @@
 	 * @generated
 	 */
 	public boolean validateBetweenInterfacesPorts(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectorOperations.validateBetweenInterfacesPorts(this,
 			diagnostics, context);
 	}
@@ -455,7 +467,7 @@
 	 * @generated
 	 */
 	public boolean validateBetweenInterfacePortImplements(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ConnectorOperations.validateBetweenInterfacePortImplements(this,
 			diagnostics, context);
 	}
@@ -466,7 +478,7 @@
 	 * @generated
 	 */
 	public boolean validateBetweenInterfacePortSignature(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ConnectorOperations.validateBetweenInterfacePortSignature(this,
 			diagnostics, context);
 	}
@@ -477,7 +489,7 @@
 	 * @generated
 	 */
 	public boolean validateUnionSignatureCompatible(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ConnectorOperations.validateUnionSignatureCompatible(this,
 			diagnostics, context);
 	}
@@ -488,7 +500,7 @@
 	 * @generated
 	 */
 	public boolean validateAssemblyConnector(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConnectorOperations.validateAssemblyConnector(this, diagnostics,
 			context);
 	}
@@ -498,22 +510,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CONNECTOR__END :
-				return ((InternalEList) getEnds()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -523,6 +537,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR__EANNOTATIONS :
@@ -586,15 +601,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONNECTOR__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONNECTOR__NAME :
 				setName((String) newValue);
@@ -604,7 +623,8 @@
 				return;
 			case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -620,18 +640,20 @@
 				return;
 			case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR :
 				getRedefinedConnectors().clear();
-				getRedefinedConnectors().addAll((Collection) newValue);
+				getRedefinedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.CONNECTOR__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 			case UMLPackage.CONNECTOR__KIND :
 				setKind((ConnectorKind) newValue);
 				return;
 			case UMLPackage.CONNECTOR__CONTRACT :
 				getContracts().clear();
-				getContracts().addAll((Collection) newValue);
+				getContracts()
+					.addAll((Collection<? extends Behavior>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -642,6 +664,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR__EANNOTATIONS :
@@ -692,6 +715,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONNECTOR__EANNOTATIONS :
@@ -747,6 +771,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -776,6 +801,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.CONNECTOR__REDEFINED_CONNECTOR);
@@ -798,6 +824,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || eIsSet(UMLPackage.CONNECTOR__END);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConsiderIgnoreFragmentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConsiderIgnoreFragmentImpl.java
index 8154d09..f31c598 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConsiderIgnoreFragmentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConsiderIgnoreFragmentImpl.java
@@ -8,25 +8,30 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConsiderIgnoreFragmentImpl.java,v 1.13 2006/04/10 19:16:21 khussey Exp $
+ * $Id: ConsiderIgnoreFragmentImpl.java,v 1.14 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConsiderIgnoreFragment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.Gate;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
 import org.eclipse.uml2.uml.InteractionOperatorKind;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -59,7 +64,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList messages = null;
+	protected EList<NamedElement> messages = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -75,6 +80,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONSIDER_IGNORE_FRAGMENT;
 	}
@@ -84,9 +90,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMessages() {
+	public EList<NamedElement> getMessages() {
 		if (messages == null) {
-			messages = new EObjectResolvingEList(NamedElement.class, this,
+			messages = new EObjectResolvingEList<NamedElement>(
+				NamedElement.class, this,
 				UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE);
 		}
 		return messages;
@@ -108,8 +115,7 @@
 	 */
 	public NamedElement getMessage(String name, boolean ignoreCase,
 			EClass eClass) {
-		messageLoop : for (Iterator i = getMessages().iterator(); i.hasNext();) {
-			NamedElement message = (NamedElement) i.next();
+		messageLoop : for (NamedElement message : getMessages()) {
 			if (eClass != null && !eClass.isInstance(message))
 				continue messageLoop;
 			if (name != null && !(ignoreCase
@@ -127,7 +133,7 @@
 	 * @generated
 	 */
 	public boolean validateConsiderOrIgnore(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConsiderIgnoreFragmentOperations.validateConsiderOrIgnore(this,
 			diagnostics, context);
 	}
@@ -137,7 +143,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConsiderIgnoreFragmentOperations.validateType(this, diagnostics,
 			context);
 	}
@@ -147,6 +154,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
@@ -204,15 +212,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME :
 				setName((String) newValue);
@@ -222,18 +234,20 @@
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -246,15 +260,18 @@
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND :
 				getOperands().clear();
-				getOperands().addAll((Collection) newValue);
+				getOperands().addAll(
+					(Collection<? extends InteractionOperand>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE :
 				getCfragmentGates().clear();
-				getCfragmentGates().addAll((Collection) newValue);
+				getCfragmentGates().addAll(
+					(Collection<? extends Gate>) newValue);
 				return;
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE :
 				getMessages().clear();
-				getMessages().addAll((Collection) newValue);
+				getMessages().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -265,6 +282,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
@@ -318,6 +336,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConstraintImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConstraintImpl.java
index 8885f24..fd350b1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConstraintImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ConstraintImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConstraintImpl.java,v 1.19 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ConstraintImpl.java,v 1.20 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,7 +37,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.StringExpression;
@@ -77,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList constrainedElements = null;
+	protected EList<Element> constrainedElements = null;
 
 	/**
 	 * The cached value of the '{@link #getSpecification() <em>Specification</em>}' containment reference.
@@ -103,6 +106,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONSTRAINT;
 	}
@@ -112,23 +116,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.CONSTRAINT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.CONSTRAINT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -137,10 +143,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConstrainedElements() {
+	public EList<Element> getConstrainedElements() {
 		if (constrainedElements == null) {
-			constrainedElements = new EObjectResolvingEList(Element.class,
-				this, UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT);
+			constrainedElements = new EObjectResolvingEList<Element>(
+				Element.class, this, UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT);
 		}
 		return constrainedElements;
 	}
@@ -317,7 +323,7 @@
 	 * @generated
 	 */
 	public boolean validateNotApplyToSelf(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConstraintOperations.validateNotApplyToSelf(this, diagnostics,
 			context);
 	}
@@ -328,7 +334,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationBoolean(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ConstraintOperations.validateValueSpecificationBoolean(this,
 			diagnostics, context);
 	}
@@ -338,7 +344,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateBooleanValue(DiagnosticChain diagnostics, Map context) {
+	public boolean validateBooleanValue(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ConstraintOperations.validateBooleanValue(this, diagnostics,
 			context);
 	}
@@ -349,7 +356,7 @@
 	 * @generated
 	 */
 	public boolean validateNoSideEffects(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConstraintOperations.validateNoSideEffects(this, diagnostics,
 			context);
 	}
@@ -360,7 +367,7 @@
 	 * @generated
 	 */
 	public boolean validateNotAppliedToSelf(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ConstraintOperations.validateNotAppliedToSelf(this, diagnostics,
 			context);
 	}
@@ -370,15 +377,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -405,18 +414,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
@@ -436,6 +446,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -455,6 +466,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
@@ -510,15 +522,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONSTRAINT__NAME :
 				setName((String) newValue);
@@ -528,7 +544,8 @@
 				return;
 			case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -541,7 +558,8 @@
 				return;
 			case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT :
 				getConstrainedElements().clear();
-				getConstrainedElements().addAll((Collection) newValue);
+				getConstrainedElements().addAll(
+					(Collection<? extends Element>) newValue);
 				return;
 			case UMLPackage.CONSTRAINT__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -558,6 +576,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
@@ -602,6 +621,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONSTRAINT__EANNOTATIONS :
@@ -672,6 +692,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.CONSTRAINT__SPECIFICATION);
@@ -696,6 +717,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.CONSTRAINT__CONTEXT);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ContinuationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ContinuationImpl.java
index 32093ab..1174e26 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ContinuationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ContinuationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ContinuationImpl.java,v 1.13 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ContinuationImpl.java,v 1.14 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,12 +19,17 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Continuation;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -83,6 +88,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONTINUATION;
 	}
@@ -119,7 +125,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameName(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameName(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ContinuationOperations.validateSameName(this, diagnostics,
 			context);
 	}
@@ -129,7 +136,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGlobal(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGlobal(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ContinuationOperations
 			.validateGlobal(this, diagnostics, context);
 	}
@@ -140,7 +148,7 @@
 	 * @generated
 	 */
 	public boolean validateFirstOrLastInteractionFragment(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ContinuationOperations.validateFirstOrLastInteractionFragment(
 			this, diagnostics, context);
 	}
@@ -150,6 +158,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CONTINUATION__EANNOTATIONS :
@@ -203,15 +212,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CONTINUATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CONTINUATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CONTINUATION__NAME :
 				setName((String) newValue);
@@ -221,18 +234,20 @@
 				return;
 			case UMLPackage.CONTINUATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CONTINUATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.CONTINUATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.CONTINUATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -252,6 +267,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONTINUATION__EANNOTATIONS :
@@ -296,6 +312,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CONTINUATION__EANNOTATIONS :
@@ -340,6 +357,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlFlowImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlFlowImpl.java
index c1245fd..26c6af8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlFlowImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlFlowImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ControlFlowImpl.java,v 1.2 2005/11/23 20:01:19 khussey Exp $
+ * $Id: ControlFlowImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONTROL_FLOW;
 	}
@@ -59,7 +60,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateObjectNodes(DiagnosticChain diagnostics, Map context) {
+	public boolean validateObjectNodes(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ControlFlowOperations.validateObjectNodes(this, diagnostics,
 			context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlNodeImpl.java
index cb02824..6ce4163 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ControlNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ControlNodeImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: ControlNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CONTROL_NODE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkActionImpl.java
index 63c2e69..59ccf1d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkActionImpl.java,v 1.14 2006/04/10 19:16:19 khussey Exp $
+ * $Id: CreateLinkActionImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -59,6 +59,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CREATE_LINK_ACTION;
 	}
@@ -68,9 +69,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEndData() {
+	public EList<LinkEndData> getEndData() {
 		if (endData == null) {
-			endData = new EObjectContainmentEList.Resolving(
+			endData = new EObjectContainmentEList.Resolving<LinkEndData>(
 				LinkEndCreationData.class, this,
 				UMLPackage.CREATE_LINK_ACTION__END_DATA);
 		}
@@ -82,6 +83,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public LinkEndData createEndData() {
 		LinkEndCreationData newEndData = (LinkEndCreationData) create(UMLPackage.Literals.LINK_END_CREATION_DATA);
 		getEndData().add(newEndData);
@@ -103,7 +105,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationNotAbstract(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CreateLinkActionOperations.validateAssociationNotAbstract(this,
 			diagnostics, context);
 	}
@@ -113,6 +115,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
@@ -196,6 +199,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkObjectActionImpl.java
index c544d8b..a7bdb22 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateLinkObjectActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkObjectActionImpl.java,v 1.21 2006/11/14 18:02:16 khussey Exp $
+ * $Id: CreateLinkObjectActionImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,17 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.CreateLinkObjectAction;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
+import org.eclipse.uml2.uml.LinkEndData;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -87,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION;
 	}
@@ -96,22 +108,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -227,7 +241,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationClass(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CreateLinkObjectActionOperations.validateAssociationClass(this,
 			diagnostics, context);
 	}
@@ -237,7 +251,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTypeOfResult(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CreateLinkObjectActionOperations.validateTypeOfResult(this,
 			diagnostics, context);
 	}
@@ -247,7 +262,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CreateLinkObjectActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -257,18 +273,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -276,32 +293,32 @@
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				return ((InternalEList) getEndData()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				return ((InternalEList) getInputValues()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getInputValues()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -313,6 +330,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
@@ -400,15 +418,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -418,7 +440,8 @@
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -434,43 +457,54 @@
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
 				getEndData().clear();
-				getEndData().addAll((Collection) newValue);
+				getEndData().addAll(
+					(Collection<? extends LinkEndData>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
 				getInputValues().clear();
-				getInputValues().addAll((Collection) newValue);
+				getInputValues().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
 				setResult((OutputPin) newValue);
@@ -484,6 +518,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
@@ -555,6 +590,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
@@ -642,6 +678,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateObjectActionImpl.java
index 7e28c77..a21d3cb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreateObjectActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateObjectActionImpl.java,v 1.21 2006/11/14 18:02:16 khussey Exp $
+ * $Id: CreateObjectActionImpl.java,v 1.22 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,8 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.CreateObjectAction;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -99,6 +108,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CREATE_OBJECT_ACTION;
 	}
@@ -108,22 +118,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.CREATE_OBJECT_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.CREATE_OBJECT_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.CREATE_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -278,7 +290,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CreateObjectActionOperations.validateClassifierNotAbstract(this,
 			diagnostics, context);
 	}
@@ -289,7 +301,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifierNotAssociationClass(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return CreateObjectActionOperations
 			.validateClassifierNotAssociationClass(this, diagnostics, context);
 	}
@@ -299,7 +311,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CreateObjectActionOperations.validateSameType(this, diagnostics,
 			context);
 	}
@@ -309,7 +322,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return CreateObjectActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -319,18 +333,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -338,26 +353,26 @@
 			case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -369,6 +384,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
@@ -456,15 +472,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -474,7 +494,8 @@
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -490,35 +511,44 @@
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER :
 				setClassifier((Classifier) newValue);
@@ -535,6 +565,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
@@ -603,6 +634,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
@@ -688,6 +720,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.CREATE_OBJECT_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreationEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreationEventImpl.java
index 95e7a89..176aaf9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreationEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/CreationEventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreationEventImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: CreationEventImpl.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.CREATION_EVENT;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateNoOccurrenceAbove(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return CreationEventOperations.validateNoOccurrenceAbove(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataStoreNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataStoreNodeImpl.java
index 78c3a86..f1abf0d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataStoreNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataStoreNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DataStoreNodeImpl.java,v 1.2 2005/11/23 20:01:19 khussey Exp $
+ * $Id: DataStoreNodeImpl.java,v 1.3 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DATA_STORE_NODE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataTypeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataTypeImpl.java
index a889ad6..c050822 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataTypeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DataTypeImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DataTypeImpl.java,v 1.25 2006/11/14 18:02:19 khussey Exp $
+ * $Id: DataTypeImpl.java,v 1.26 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -29,18 +29,29 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.DataTypeOperations;
@@ -74,7 +85,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedOperations() <em>Owned Operation</em>}' containment reference list.
@@ -84,7 +95,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedOperations = null;
+	protected EList<Operation> ownedOperations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -100,6 +111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DATA_TYPE;
 	}
@@ -109,23 +121,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.DATA_TYPE__ATTRIBUTE,
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.DATA_TYPE__ATTRIBUTE,
 						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.DATA_TYPE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -134,25 +147,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.DATA_TYPE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.DATA_TYPE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.DATA_TYPE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -160,22 +174,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.DATA_TYPE__FEATURE, FEATURE_ESUBSETS));
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.DATA_TYPE__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.DATA_TYPE__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -184,9 +200,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentWithInverseEList.Resolving(
+			ownedAttributes = new EObjectContainmentWithInverseEList.Resolving<Property>(
 				Property.class, this, UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE,
 				UMLPackage.PROPERTY__DATATYPE);
 		}
@@ -233,9 +249,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -256,9 +270,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedOperations() {
+	public EList<Operation> getOwnedOperations() {
 		if (ownedOperations == null) {
-			ownedOperations = new EObjectContainmentWithInverseEList.Resolving(
+			ownedOperations = new EObjectContainmentWithInverseEList.Resolving<Operation>(
 				Operation.class, this, UMLPackage.DATA_TYPE__OWNED_OPERATION,
 				UMLPackage.OPERATION__DATATYPE);
 		}
@@ -271,7 +285,7 @@
 	 * @generated
 	 */
 	public Operation createOwnedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
@@ -302,8 +316,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedOperation(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -313,28 +327,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedOperationLoop : for (Iterator i = getOwnedOperations().iterator(); i
-			.hasNext();) {
-			Operation ownedOperation = (Operation) i.next();
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedOperationLoop : for (Operation ownedOperation : getOwnedOperations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedOperation.getName())
 				: name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList ownedParameterList = ownedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -357,8 +369,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType) {
+	public Operation createOwnedOperation(String name,
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			Type returnType) {
 		return DataTypeOperations.createOwnedOperation(this, name,
 			parameterNames, parameterTypes, returnType);
 	}
@@ -379,7 +392,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList inherit(EList inhs) {
+	public EList<NamedElement> inherit(EList<NamedElement> inhs) {
 		return DataTypeOperations.inherit(this, inhs);
 	}
 
@@ -388,24 +401,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -420,8 +435,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -431,22 +446,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -456,61 +472,62 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -521,6 +538,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
@@ -630,15 +648,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__NAME :
 				setName((String) newValue);
@@ -648,22 +670,26 @@
 				return;
 			case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -679,7 +705,8 @@
 				return;
 			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -689,46 +716,55 @@
 				return;
 			case UMLPackage.DATA_TYPE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -739,6 +775,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
@@ -831,6 +868,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DATA_TYPE__EANNOTATIONS :
@@ -935,6 +973,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE);
@@ -958,6 +997,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE)
@@ -980,6 +1020,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_OPERATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DecisionNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DecisionNodeImpl.java
index ae9d1dd..95ac9eb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DecisionNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DecisionNodeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DecisionNodeImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: DecisionNodeImpl.java,v 1.15 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,21 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.DecisionNode;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -75,6 +82,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DECISION_NODE;
 	}
@@ -129,7 +137,7 @@
 	 * @generated
 	 */
 	public boolean validateOneIncomingEdge(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DecisionNodeOperations.validateOneIncomingEdge(this,
 			diagnostics, context);
 	}
@@ -140,7 +148,7 @@
 	 * @generated
 	 */
 	public boolean validateInputParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DecisionNodeOperations.validateInputParameter(this, diagnostics,
 			context);
 	}
@@ -150,7 +158,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return DecisionNodeOperations.validateEdges(this, diagnostics, context);
 	}
 
@@ -159,6 +168,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DECISION_NODE__EANNOTATIONS :
@@ -228,15 +238,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DECISION_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__NAME :
 				setName((String) newValue);
@@ -246,7 +260,8 @@
 				return;
 			case UMLPackage.DECISION_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -262,23 +277,29 @@
 				return;
 			case UMLPackage.DECISION_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.DECISION_NODE__DECISION_INPUT :
 				setDecisionInput((Behavior) newValue);
@@ -292,6 +313,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DECISION_NODE__EANNOTATIONS :
@@ -348,6 +370,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DECISION_NODE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DependencyImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DependencyImpl.java
index 9756277..236a6b6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DependencyImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DependencyImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DependencyImpl.java,v 1.15 2006/11/14 18:02:17 khussey Exp $
+ * $Id: DependencyImpl.java,v 1.16 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -30,6 +30,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
@@ -69,7 +70,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList suppliers = null;
+	protected EList<NamedElement> suppliers = null;
 
 	/**
 	 * The cached value of the '{@link #getClients() <em>Client</em>}' reference list.
@@ -79,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList clients = null;
+	protected EList<NamedElement> clients = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -95,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEPENDENCY;
 	}
@@ -104,24 +106,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.DEPENDENCY__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DEPENDENCY__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
@@ -130,22 +134,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.DEPENDENCY__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.DEPENDENCY__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DEPENDENCY__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -154,22 +160,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.DEPENDENCY__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.DEPENDENCY__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DEPENDENCY__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -178,10 +186,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new EObjectResolvingEList(NamedElement.class, this,
-				UMLPackage.DEPENDENCY__SUPPLIER);
+			suppliers = new EObjectResolvingEList<NamedElement>(
+				NamedElement.class, this, UMLPackage.DEPENDENCY__SUPPLIER);
 		}
 		return suppliers;
 	}
@@ -202,8 +210,7 @@
 	 */
 	public NamedElement getSupplier(String name, boolean ignoreCase,
 			EClass eClass) {
-		supplierLoop : for (Iterator i = getSuppliers().iterator(); i.hasNext();) {
-			NamedElement supplier = (NamedElement) i.next();
+		supplierLoop : for (NamedElement supplier : getSuppliers()) {
 			if (eClass != null && !eClass.isInstance(supplier))
 				continue supplierLoop;
 			if (name != null && !(ignoreCase
@@ -220,9 +227,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClients() {
+	public EList<NamedElement> getClients() {
 		if (clients == null) {
-			clients = new EObjectWithInverseResolvingEList.ManyInverse(
+			clients = new EObjectWithInverseResolvingEList.ManyInverse<NamedElement>(
 				NamedElement.class, this, UMLPackage.DEPENDENCY__CLIENT,
 				UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY);
 		}
@@ -244,8 +251,7 @@
 	 * @generated
 	 */
 	public NamedElement getClient(String name, boolean ignoreCase, EClass eClass) {
-		clientLoop : for (Iterator i = getClients().iterator(); i.hasNext();) {
-			NamedElement client = (NamedElement) i.next();
+		clientLoop : for (NamedElement client : getClients()) {
 			if (eClass != null && !eClass.isInstance(client))
 				continue clientLoop;
 			if (name != null && !(ignoreCase
@@ -262,15 +268,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -285,7 +293,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.DEPENDENCY__CLIENT :
-				return ((InternalEList) getClients()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClients())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -295,18 +304,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
@@ -314,7 +324,7 @@
 			case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.DEPENDENCY__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -325,6 +335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
@@ -380,15 +391,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DEPENDENCY__NAME :
 				setName((String) newValue);
@@ -398,7 +413,8 @@
 				return;
 			case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -411,11 +427,13 @@
 				return;
 			case UMLPackage.DEPENDENCY__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.DEPENDENCY__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -426,6 +444,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
@@ -467,6 +486,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPENDENCY__EANNOTATIONS :
@@ -515,7 +535,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.DEPENDENCY__RELATED_ELEMENT :
@@ -542,7 +563,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeployedArtifactImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeployedArtifactImpl.java
index 94c973c..5cd003a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeployedArtifactImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeployedArtifactImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeployedArtifactImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: DeployedArtifactImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEPLOYED_ARTIFACT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentImpl.java
index 495380c..adc6ff8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentImpl.java,v 1.19 2006/11/14 18:02:20 khussey Exp $
+ * $Id: DeploymentImpl.java,v 1.20 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +35,8 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DeployedArtifact;
 import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.DeploymentSpecification;
@@ -76,7 +78,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList deployedArtifacts = null;
+	protected EList<DeployedArtifact> deployedArtifacts = null;
 
 	/**
 	 * The cached value of the '{@link #getConfigurations() <em>Configuration</em>}' containment reference list.
@@ -86,7 +88,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList configurations = null;
+	protected EList<DeploymentSpecification> configurations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -102,6 +104,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEPLOYMENT;
 	}
@@ -111,23 +114,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.DEPLOYMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.DEPLOYMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DEPLOYMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -136,9 +141,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new SubsetSupersetEObjectResolvingEList(
+			suppliers = new SubsetSupersetEObjectResolvingEList<NamedElement>(
 				NamedElement.class, this, UMLPackage.DEPLOYMENT__SUPPLIER,
 				null, SUPPLIER_ESUBSETS);
 		}
@@ -150,9 +155,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClients() {
+	public EList<NamedElement> getClients() {
 		if (clients == null) {
-			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<NamedElement>(
 				NamedElement.class, this, UMLPackage.DEPLOYMENT__CLIENT, null,
 				CLIENT_ESUBSETS, UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY);
 		}
@@ -164,9 +169,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployedArtifacts() {
+	public EList<DeployedArtifact> getDeployedArtifacts() {
 		if (deployedArtifacts == null) {
-			deployedArtifacts = new SubsetSupersetEObjectResolvingEList(
+			deployedArtifacts = new SubsetSupersetEObjectResolvingEList<DeployedArtifact>(
 				DeployedArtifact.class, this,
 				UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT,
 				DEPLOYED_ARTIFACT_ESUPERSETS, null);
@@ -190,9 +195,7 @@
 	 */
 	public DeployedArtifact getDeployedArtifact(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedArtifactLoop : for (Iterator i = getDeployedArtifacts()
-			.iterator(); i.hasNext();) {
-			DeployedArtifact deployedArtifact = (DeployedArtifact) i.next();
+		deployedArtifactLoop : for (DeployedArtifact deployedArtifact : getDeployedArtifacts()) {
 			if (eClass != null && !eClass.isInstance(deployedArtifact))
 				continue deployedArtifactLoop;
 			if (name != null && !(ignoreCase
@@ -209,9 +212,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConfigurations() {
+	public EList<DeploymentSpecification> getConfigurations() {
 		if (configurations == null) {
-			configurations = new EObjectContainmentWithInverseEList.Resolving(
+			configurations = new EObjectContainmentWithInverseEList.Resolving<DeploymentSpecification>(
 				DeploymentSpecification.class, this,
 				UMLPackage.DEPLOYMENT__CONFIGURATION,
 				UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT);
@@ -248,10 +251,7 @@
 	 */
 	public DeploymentSpecification getConfiguration(String name,
 			boolean ignoreCase, boolean createOnDemand) {
-		configurationLoop : for (Iterator i = getConfigurations().iterator(); i
-			.hasNext();) {
-			DeploymentSpecification configuration = (DeploymentSpecification) i
-				.next();
+		configurationLoop : for (DeploymentSpecification configuration : getConfigurations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(configuration.getName())
 				: name.equals(configuration.getName())))
@@ -298,7 +298,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newLocation != null) {
-				EList clients = getClients();
+				EList<NamedElement> clients = getClients();
 				if (!clients.contains(newLocation)) {
 					clients.add(newLocation);
 				}
@@ -340,15 +340,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -363,10 +365,11 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.DEPLOYMENT__CLIENT :
-				return ((InternalEList) getClients()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClients())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return ((InternalEList) getConfigurations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConfigurations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__LOCATION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -380,18 +383,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
@@ -399,10 +403,10 @@
 			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.DEPLOYMENT__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return ((InternalEList) getConfigurations()).basicRemove(
+				return ((InternalEList<?>) getConfigurations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT__LOCATION :
 				return basicSetLocation(null, msgs);
@@ -415,6 +419,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -435,6 +440,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
@@ -498,15 +504,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__NAME :
 				setName((String) newValue);
@@ -516,7 +526,8 @@
 				return;
 			case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -529,19 +540,23 @@
 				return;
 			case UMLPackage.DEPLOYMENT__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT :
 				getDeployedArtifacts().clear();
-				getDeployedArtifacts().addAll((Collection) newValue);
+				getDeployedArtifacts().addAll(
+					(Collection<? extends DeployedArtifact>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__CONFIGURATION :
 				getConfigurations().clear();
-				getConfigurations().addAll((Collection) newValue);
+				getConfigurations().addAll(
+					(Collection<? extends DeploymentSpecification>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT__LOCATION :
 				setLocation((DeploymentTarget) newValue);
@@ -555,6 +570,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
@@ -605,6 +621,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
@@ -703,6 +720,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.DEPLOYMENT__CONFIGURATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentSpecificationImpl.java
index 412a984..cd18967 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentSpecificationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentSpecificationImpl.java,v 1.19 2006/11/14 18:02:16 khussey Exp $
+ * $Id: DeploymentSpecificationImpl.java,v 1.20 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,13 +29,28 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Artifact;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.DeploymentSpecification;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.Manifestation;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.DeploymentSpecificationOperations;
@@ -130,6 +146,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEPLOYMENT_SPECIFICATION;
 	}
@@ -312,7 +329,7 @@
 	 * @generated
 	 */
 	public boolean validateDeployedElements(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DeploymentSpecificationOperations.validateDeployedElements(this,
 			diagnostics, context);
 	}
@@ -323,7 +340,7 @@
 	 * @generated
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DeploymentSpecificationOperations.validateDeploymentTarget(this,
 			diagnostics, context);
 	}
@@ -333,24 +350,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -365,8 +384,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -378,16 +397,17 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -401,67 +421,68 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				return ((InternalEList) getNestedArtifacts()).basicRemove(
+				return ((InternalEList<?>) getNestedArtifacts()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				return ((InternalEList) getManifestations()).basicRemove(
+				return ((InternalEList<?>) getManifestations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
 				return basicSetDeployment(null, msgs);
@@ -474,6 +495,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -494,6 +516,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
@@ -617,15 +640,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -635,22 +662,26 @@
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -666,7 +697,8 @@
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -676,57 +708,68 @@
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME :
 				setFileName((String) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
 				getNestedArtifacts().clear();
-				getNestedArtifacts().addAll((Collection) newValue);
+				getNestedArtifacts().addAll(
+					(Collection<? extends Artifact>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
 				getManifestations().clear();
-				getManifestations().addAll((Collection) newValue);
+				getManifestations().addAll(
+					(Collection<? extends Manifestation>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION :
 				setDeploymentLocation((String) newValue);
@@ -746,6 +789,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
@@ -856,6 +900,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
@@ -962,6 +1007,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentTargetImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentTargetImpl.java
index 17c820e..ffaa509 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentTargetImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeploymentTargetImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentTargetImpl.java,v 1.19 2006/11/14 18:02:15 khussey Exp $
+ * $Id: DeploymentTargetImpl.java,v 1.20 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -30,6 +30,7 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.DeploymentTarget;
@@ -69,7 +70,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList deployments = null;
+	protected EList<Deployment> deployments = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -85,6 +86,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEPLOYMENT_TARGET;
 	}
@@ -94,23 +96,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -119,9 +123,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this,
 				UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY, null,
 				CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
@@ -134,9 +138,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployments() {
+	public EList<Deployment> getDeployments() {
 		if (deployments == null) {
-			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Deployment>(
 				Deployment.class, this,
 				UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT,
 				DEPLOYMENT_ESUPERSETS, null, UMLPackage.DEPLOYMENT__LOCATION);
@@ -173,9 +177,7 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Iterator i = getDeployments().iterator(); i
-			.hasNext();) {
-			Deployment deployment = (Deployment) i.next();
+		deploymentLoop : for (Deployment deployment : getDeployments()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(deployment.getName())
 				: name.equals(deployment.getName())))
@@ -192,12 +194,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployedElements() {
+	public EList<PackageableElement> getDeployedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this,
+					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
 			if (result == null) {
 				cache.put(this,
 					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT,
@@ -225,9 +229,7 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (Iterator i = getDeployedElements()
-			.iterator(); i.hasNext();) {
-			PackageableElement deployedElement = (PackageableElement) i.next();
+		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
 			if (name != null && !(ignoreCase
@@ -244,18 +246,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -265,23 +269,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getDeployments()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -291,6 +296,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
@@ -332,15 +338,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_TARGET__NAME :
 				setName((String) newValue);
@@ -350,14 +360,16 @@
 				return;
 			case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -368,6 +380,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
@@ -400,6 +413,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
@@ -471,6 +485,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyLinkActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyLinkActionImpl.java
index 789bbaf..c72c5f4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyLinkActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyLinkActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestroyLinkActionImpl.java,v 1.14 2006/04/10 19:16:20 khussey Exp $
+ * $Id: DestroyLinkActionImpl.java,v 1.15 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -53,6 +53,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DESTROY_LINK_ACTION;
 	}
@@ -62,9 +63,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEndData() {
+	public EList<LinkEndData> getEndData() {
 		if (endData == null) {
-			endData = new EObjectContainmentEList.Resolving(
+			endData = new EObjectContainmentEList.Resolving<LinkEndData>(
 				LinkEndDestructionData.class, this,
 				UMLPackage.DESTROY_LINK_ACTION__END_DATA);
 		}
@@ -76,6 +77,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public LinkEndData createEndData() {
 		LinkEndDestructionData newEndData = (LinkEndDestructionData) create(UMLPackage.Literals.LINK_END_DESTRUCTION_DATA);
 		getEndData().add(newEndData);
@@ -96,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
@@ -179,6 +182,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyObjectActionImpl.java
index 105b849..3e3db1b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestroyObjectActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestroyObjectActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: DestroyObjectActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,8 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DestroyObjectAction;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -129,6 +138,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DESTROY_OBJECT_ACTION;
 	}
@@ -138,23 +148,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(InputPin.class,
-							this, UMLPackage.DESTROY_OBJECT_ACTION__INPUT,
+						inputs = new DerivedUnionEObjectEList<InputPin>(
+							InputPin.class, this,
+							UMLPackage.DESTROY_OBJECT_ACTION__INPUT,
 							INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.DESTROY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -329,7 +341,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return DestroyObjectActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -339,7 +352,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return DestroyObjectActionOperations.validateNoType(this, diagnostics,
 			context);
 	}
@@ -349,18 +363,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -368,26 +383,26 @@
 			case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
 				return basicSetTarget(null, msgs);
 		}
@@ -399,6 +414,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
@@ -490,15 +506,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -508,7 +528,8 @@
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -524,35 +545,44 @@
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS :
 				setIsDestroyLinks(((Boolean) newValue).booleanValue());
@@ -572,6 +602,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
@@ -643,6 +674,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
@@ -720,6 +752,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -748,6 +781,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestructionEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestructionEventImpl.java
index 6370a8b..a4e6538 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestructionEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DestructionEventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestructionEventImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: DestructionEventImpl.java,v 1.3 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DESTRUCTION_EVENT;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateNoOccurrenceSpecificationsBelow(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return DestructionEventOperations
 			.validateNoOccurrenceSpecificationsBelow(this, diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeviceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeviceImpl.java
index b37178b..4ff443f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeviceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DeviceImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeviceImpl.java,v 1.2 2005/11/23 20:01:20 khussey Exp $
+ * $Id: DeviceImpl.java,v 1.3 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DEVICE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DirectedRelationshipImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DirectedRelationshipImpl.java
index ac5e096..0f7232e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DirectedRelationshipImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DirectedRelationshipImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DirectedRelationshipImpl.java,v 1.11 2006/11/14 18:02:20 khussey Exp $
+ * $Id: DirectedRelationshipImpl.java,v 1.12 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -57,6 +57,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DIRECTED_RELATIONSHIP;
 	}
@@ -66,22 +67,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null);
 	}
 
@@ -90,24 +93,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT,
 			RELATED_ELEMENT_ESUBSETS);
 	}
@@ -117,22 +122,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null);
 	}
 
@@ -141,6 +148,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS :
@@ -168,6 +176,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS :
@@ -214,6 +223,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRelatedElements() {
 		return super.isSetRelatedElements() || isSetSources() || isSetTargets();
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationConstraintImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationConstraintImpl.java
index 8da316b..0ce4bfc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationConstraintImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationConstraintImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationConstraintImpl.java,v 1.19 2006/11/14 18:02:19 khussey Exp $
+ * $Id: DurationConstraintImpl.java,v 1.20 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -21,6 +21,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,7 +29,10 @@
 
 import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DurationConstraint;
+import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.DurationInterval;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.StringExpression;
@@ -67,7 +71,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList firstEvents = null;
+	protected EList<Boolean> firstEvents = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -83,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DURATION_CONSTRAINT;
 	}
@@ -92,10 +97,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFirstEvents() {
+	public EList<Boolean> getFirstEvents() {
 		if (firstEvents == null) {
-			firstEvents = new EDataTypeUniqueEList(Boolean.class, this,
-				UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT);
+			firstEvents = new EDataTypeUniqueEList<Boolean>(Boolean.class,
+				this, UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT);
 		}
 		return firstEvents;
 	}
@@ -164,6 +169,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
 
@@ -210,6 +216,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
 		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
@@ -236,7 +243,7 @@
 	 * @generated
 	 */
 	public boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DurationConstraintOperations.validateFirstEventMultiplicity(
 			this, diagnostics, context);
 	}
@@ -246,6 +253,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
@@ -303,15 +311,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__NAME :
 				setName((String) newValue);
@@ -321,7 +333,8 @@
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -334,7 +347,8 @@
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT :
 				getConstrainedElements().clear();
-				getConstrainedElements().addAll((Collection) newValue);
+				getConstrainedElements().addAll(
+					(Collection<? extends Element>) newValue);
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -344,7 +358,8 @@
 				return;
 			case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT :
 				getFirstEvents().clear();
-				getFirstEvents().addAll((Collection) newValue);
+				getFirstEvents().addAll(
+					(Collection<? extends Boolean>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -355,6 +370,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
@@ -402,6 +418,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
@@ -449,6 +466,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationImpl.java
index 5910b87..dda8f76 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationImpl.java,v 1.14 2006/11/14 18:02:20 khussey Exp $
+ * $Id: DurationImpl.java,v 1.15 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -25,6 +25,8 @@
 
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Duration;
 import org.eclipse.uml2.uml.Observation;
 import org.eclipse.uml2.uml.StringExpression;
@@ -72,7 +74,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList observations = null;
+	protected EList<Observation> observations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -88,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DURATION;
 	}
@@ -139,10 +142,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getObservations() {
+	public EList<Observation> getObservations() {
 		if (observations == null) {
-			observations = new EObjectResolvingEList(Observation.class, this,
-				UMLPackage.DURATION__OBSERVATION);
+			observations = new EObjectResolvingEList<Observation>(
+				Observation.class, this, UMLPackage.DURATION__OBSERVATION);
 		}
 		return observations;
 	}
@@ -163,9 +166,7 @@
 	 */
 	public Observation getObservation(String name, boolean ignoreCase,
 			EClass eClass) {
-		observationLoop : for (Iterator i = getObservations().iterator(); i
-			.hasNext();) {
-			Observation observation = (Observation) i.next();
+		observationLoop : for (Observation observation : getObservations()) {
 			if (eClass != null && !eClass.isInstance(observation))
 				continue observationLoop;
 			if (name != null && !(ignoreCase
@@ -191,6 +192,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DURATION__EANNOTATIONS :
@@ -246,15 +248,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DURATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DURATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DURATION__NAME :
 				setName((String) newValue);
@@ -264,7 +270,8 @@
 				return;
 			case UMLPackage.DURATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DURATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -283,7 +290,8 @@
 				return;
 			case UMLPackage.DURATION__OBSERVATION :
 				getObservations().clear();
-				getObservations().addAll((Collection) newValue);
+				getObservations().addAll(
+					(Collection<? extends Observation>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -294,6 +302,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION__EANNOTATIONS :
@@ -338,6 +347,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationIntervalImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationIntervalImpl.java
index 1d14b9b..a169ec0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationIntervalImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationIntervalImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationIntervalImpl.java,v 1.12 2006/11/14 18:02:16 khussey Exp $
+ * $Id: DurationIntervalImpl.java,v 1.13 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -56,6 +56,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DURATION_INTERVAL;
 	}
@@ -102,6 +103,7 @@
 
 	}
 
+	@Override
 	public void setMin(ValueSpecification newMin) {
 
 		if (newMin != null && !(newMin instanceof Duration)) {
@@ -162,6 +164,7 @@
 
 	}
 
+	@Override
 	public void setMax(ValueSpecification newMax) {
 
 		if (newMax != null && !(newMax instanceof Duration)) {
@@ -185,6 +188,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
@@ -242,6 +246,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationObservationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationObservationImpl.java
index 3a71aaf..8a5db14 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationObservationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/DurationObservationImpl.java
@@ -8,22 +8,24 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationObservationImpl.java,v 1.5 2006/04/10 19:16:20 khussey Exp $
+ * $Id: DurationObservationImpl.java,v 1.6 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DurationObservation;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -59,7 +61,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList events = null;
+	protected EList<NamedElement> events = null;
 
 	/**
 	 * The cached value of the '{@link #getFirstEvents() <em>First Event</em>}' attribute list.
@@ -69,7 +71,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList firstEvents = null;
+	protected EList<Boolean> firstEvents = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -85,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.DURATION_OBSERVATION;
 	}
@@ -94,9 +97,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEvents() {
+	public EList<NamedElement> getEvents() {
 		if (events == null) {
-			events = new EObjectResolvingEList(NamedElement.class, this,
+			events = new EObjectResolvingEList<NamedElement>(
+				NamedElement.class, this,
 				UMLPackage.DURATION_OBSERVATION__EVENT);
 		}
 		return events;
@@ -117,8 +121,7 @@
 	 * @generated
 	 */
 	public NamedElement getEvent(String name, boolean ignoreCase, EClass eClass) {
-		eventLoop : for (Iterator i = getEvents().iterator(); i.hasNext();) {
-			NamedElement event = (NamedElement) i.next();
+		eventLoop : for (NamedElement event : getEvents()) {
 			if (eClass != null && !eClass.isInstance(event))
 				continue eventLoop;
 			if (name != null && !(ignoreCase
@@ -135,10 +138,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFirstEvents() {
+	public EList<Boolean> getFirstEvents() {
 		if (firstEvents == null) {
-			firstEvents = new EDataTypeUniqueEList(Boolean.class, this,
-				UMLPackage.DURATION_OBSERVATION__FIRST_EVENT);
+			firstEvents = new EDataTypeUniqueEList<Boolean>(Boolean.class,
+				this, UMLPackage.DURATION_OBSERVATION__FIRST_EVENT);
 		}
 		return firstEvents;
 	}
@@ -149,7 +152,7 @@
 	 * @generated
 	 */
 	public boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return DurationObservationOperations.validateFirstEventMultiplicity(
 			this, diagnostics, context);
 	}
@@ -159,6 +162,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
@@ -208,15 +212,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.DURATION_OBSERVATION__NAME :
 				setName((String) newValue);
@@ -226,7 +234,8 @@
 				return;
 			case UMLPackage.DURATION_OBSERVATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -239,11 +248,13 @@
 				return;
 			case UMLPackage.DURATION_OBSERVATION__EVENT :
 				getEvents().clear();
-				getEvents().addAll((Collection) newValue);
+				getEvents().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT :
 				getFirstEvents().clear();
-				getFirstEvents().addAll((Collection) newValue);
+				getFirstEvents().addAll(
+					(Collection<? extends Boolean>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -254,6 +265,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
@@ -295,6 +307,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
@@ -337,6 +350,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java
index 07f8b1c..9855f80 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ElementImpl.java,v 1.35 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ElementImpl.java,v 1.36 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -41,8 +41,10 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Model;
+import org.eclipse.uml2.uml.Relationship;
 import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.UMLPackage;
 
@@ -75,7 +77,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedComments = null;
+	protected EList<Comment> ownedComments = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -91,6 +93,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ELEMENT;
 	}
@@ -100,23 +103,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.ELEMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.ELEMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -125,9 +129,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedComments() {
+	public EList<Comment> getOwnedComments() {
 		if (ownedComments == null) {
-			ownedComments = new EObjectContainmentEList.Resolving(
+			ownedComments = new EObjectContainmentEList.Resolving<Comment>(
 				Comment.class, this, UMLPackage.ELEMENT__OWNED_COMMENT);
 		}
 		return ownedComments;
@@ -149,7 +153,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotOwnSelf(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotOwnSelf(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ElementOperations.validateNotOwnSelf(this, diagnostics, context);
 	}
 
@@ -158,7 +163,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateHasOwner(DiagnosticChain diagnostics, Map context) {
+	public boolean validateHasOwner(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ElementOperations.validateHasOwner(this, diagnostics, context);
 	}
 
@@ -167,11 +173,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getStereotypeApplications() {
+	public EList<EObject> getStereotypeApplications() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(16));
+			@SuppressWarnings("unchecked")
+			EList<EObject> result = (EList<EObject>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(16));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(16), result = ElementOperations
@@ -196,11 +203,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRequiredStereotypes() {
+	public EList<Stereotype> getRequiredStereotypes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(18));
+			@SuppressWarnings("unchecked")
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(18));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(18), result = ElementOperations
@@ -225,11 +233,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAppliedStereotypes() {
+	public EList<Stereotype> getAppliedStereotypes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(20));
+			@SuppressWarnings("unchecked")
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(20));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(20), result = ElementOperations
@@ -254,7 +263,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAppliedSubstereotypes(Stereotype stereotype) {
+	public EList<Stereotype> getAppliedSubstereotypes(Stereotype stereotype) {
 		return ElementOperations.getAppliedSubstereotypes(this, stereotype);
 	}
 
@@ -311,11 +320,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelationships() {
+	public EList<Relationship> getRelationships() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(28));
+			@SuppressWarnings("unchecked")
+			EList<Relationship> result = (EList<Relationship>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(28));
 			if (result == null) {
 				cache
 					.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
@@ -332,7 +342,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelationships(EClass eClass) {
+	public EList<Relationship> getRelationships(EClass eClass) {
 		return ElementOperations.getRelationships(this, eClass);
 	}
 
@@ -341,11 +351,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSourceDirectedRelationships() {
+	public EList<DirectedRelationship> getSourceDirectedRelationships() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(30));
+			@SuppressWarnings("unchecked")
+			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache
+				.get(this, UMLPackage.Literals.ELEMENT.getEOperations().get(30));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(30), result = ElementOperations
@@ -361,7 +372,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSourceDirectedRelationships(EClass eClass) {
+	public EList<DirectedRelationship> getSourceDirectedRelationships(
+			EClass eClass) {
 		return ElementOperations.getSourceDirectedRelationships(this, eClass);
 	}
 
@@ -370,11 +382,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargetDirectedRelationships() {
+	public EList<DirectedRelationship> getTargetDirectedRelationships() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(32));
+			@SuppressWarnings("unchecked")
+			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache
+				.get(this, UMLPackage.Literals.ELEMENT.getEOperations().get(32));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(32), result = ElementOperations
@@ -390,7 +403,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargetDirectedRelationships(EClass eClass) {
+	public EList<DirectedRelationship> getTargetDirectedRelationships(
+			EClass eClass) {
 		return ElementOperations.getTargetDirectedRelationships(this, eClass);
 	}
 
@@ -399,10 +413,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getKeywords() {
+	public EList<String> getKeywords() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(eResource(), this,
+			@SuppressWarnings("unchecked")
+			EList<String> result = (EList<String>) cache.get(eResource(), this,
 				UMLPackage.Literals.ELEMENT.getEOperations().get(4));
 			if (result == null) {
 				cache.put(eResource(), this, UMLPackage.Literals.ELEMENT
@@ -500,11 +515,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getApplicableStereotypes() {
+	public EList<Stereotype> getApplicableStereotypes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(14));
+			@SuppressWarnings("unchecked")
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(14));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
 					.get(14), result = ElementOperations
@@ -547,11 +563,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allOwnedElements() {
+	public EList<Element> allOwnedElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.ELEMENT
-				.getEOperations().get(34));
+			@SuppressWarnings("unchecked")
+			EList<Element> result = (EList<Element>) cache.get(this,
+				UMLPackage.Literals.ELEMENT.getEOperations().get(34));
 			if (result == null) {
 				cache
 					.put(this, UMLPackage.Literals.ELEMENT.getEOperations()
@@ -577,14 +594,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -595,6 +613,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT__EANNOTATIONS :
@@ -616,15 +635,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -635,6 +658,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT__EANNOTATIONS :
@@ -652,6 +676,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT__EANNOTATIONS :
@@ -750,6 +775,7 @@
 		return basicGetOwner() != null;
 	}
 
+	@Override
 	public NotificationChain eBasicSetContainer(InternalEObject newContainer,
 			int newContainerFeatureID, NotificationChain msgs) {
 		msgs = super.eBasicSetContainer(newContainer, newContainerFeatureID,
@@ -770,8 +796,9 @@
 
 	private static final int ADAPTING = 1 << 7;
 
-	public EList eAdapters() {
-		EList eAdapters = super.eAdapters();
+	@Override
+	public EList<Adapter> eAdapters() {
+		EList<Adapter> eAdapters = super.eAdapters();
 
 		if ((eFlags & ADAPTING) == 0 && eAdapters.isEmpty()) {
 			CacheAdapter cacheAdapter = getCacheAdapter();
@@ -786,6 +813,7 @@
 		return eAdapters;
 	}
 
+	@Override
 	public void eSetDeliver(boolean deliver) {
 
 		if (deliver) {
@@ -799,16 +827,18 @@
 		super.eSetDeliver(deliver);
 	}
 
+	@Override
 	public boolean eNotificationRequired() {
 		return getCacheAdapter() == null
 			? super.eNotificationRequired()
 			: eDeliver();
 	}
 
+	@Override
 	public void eNotify(Notification notification) {
 
 		if (eDeliver()) {
-			BasicEList eBasicAdapters = eBasicAdapters();
+			BasicEList<Adapter> eBasicAdapters = eBasicAdapters();
 
 			if (eBasicAdapters == null || eBasicAdapters.isEmpty()) {
 				CacheAdapter cacheAdapter = getCacheAdapter();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImportImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImportImpl.java
index 22d6682..0a409f2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImportImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ElementImportImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ElementImportImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ElementImportImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Namespace;
@@ -140,6 +142,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ELEMENT_IMPORT;
 	}
@@ -149,22 +152,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.ELEMENT_IMPORT__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.ELEMENT_IMPORT__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ELEMENT_IMPORT__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -173,22 +178,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.ELEMENT_IMPORT__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.ELEMENT_IMPORT__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.ELEMENT_IMPORT__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -385,7 +392,7 @@
 	 * @generated
 	 */
 	public boolean validateVisibilityPublicOrPrivate(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ElementImportOperations.validateVisibilityPublicOrPrivate(this,
 			diagnostics, context);
 	}
@@ -396,7 +403,7 @@
 	 * @generated
 	 */
 	public boolean validateImportedElementIsPublic(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ElementImportOperations.validateImportedElementIsPublic(this,
 			diagnostics, context);
 	}
@@ -415,12 +422,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -434,14 +443,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
 				return basicSetImportingNamespace(null, msgs);
@@ -454,6 +464,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -470,6 +481,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
@@ -509,15 +521,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ELEMENT_IMPORT__VISIBILITY :
 				setVisibility((VisibilityKind) newValue);
@@ -540,6 +556,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
@@ -569,6 +586,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
@@ -602,6 +620,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -633,6 +652,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT);
@@ -665,6 +685,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
@@ -689,6 +710,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EncapsulatedClassifierImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EncapsulatedClassifierImpl.java
index c2d95fa..a516b09 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EncapsulatedClassifierImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EncapsulatedClassifierImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: EncapsulatedClassifierImpl.java,v 1.23 2006/05/08 17:46:10 khussey Exp $
+ * $Id: EncapsulatedClassifierImpl.java,v 1.24 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -25,17 +25,29 @@
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedSubsetEObjectEList;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.EncapsulatedClassifier;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 /**
@@ -80,6 +92,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ENCAPSULATED_CLASSIFIER;
 	}
@@ -89,9 +102,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this,
 				UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE);
 		}
@@ -103,22 +116,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getOwnedPorts() {
+	public EList<Port> getOwnedPorts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedPorts = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Port> ownedPorts = (EList<Port>) cache.get(eResource, this,
 				UMLPackage.Literals.ENCAPSULATED_CLASSIFIER__OWNED_PORT);
 			if (ownedPorts == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
-					ownedPorts = new DerivedSubsetEObjectEList(Port.class,
-						this, UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
+					ownedPorts = new DerivedSubsetEObjectEList<Port>(
+						Port.class, this,
+						UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
 						OWNED_PORT_ESUPERSETS));
 			}
 			return ownedPorts;
 		}
-		return new DerivedSubsetEObjectEList(Port.class, this,
+		return new DerivedSubsetEObjectEList<Port>(Port.class, this,
 			UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
 			OWNED_PORT_ESUPERSETS);
 	}
@@ -154,9 +169,7 @@
 	 */
 	public Port getOwnedPort(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedPortLoop : for (Iterator i = getOwnedPorts().iterator(); i
-			.hasNext();) {
-			Port ownedPort = (Port) i.next();
+		ownedPortLoop : for (Port ownedPort : getOwnedPorts()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedPort.getName())
 				: name.equals(ownedPort.getName())))
@@ -175,61 +188,62 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -240,6 +254,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
@@ -355,15 +370,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME :
 				setName((String) newValue);
@@ -373,22 +392,26 @@
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -404,7 +427,8 @@
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -414,50 +438,59 @@
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -468,6 +501,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
@@ -563,6 +597,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationImpl.java
index fb13146..512724e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: EnumerationImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: EnumerationImpl.java,v 1.24 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -29,14 +29,27 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Enumeration;
 import org.eclipse.uml2.uml.EnumerationLiteral;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 /**
@@ -65,7 +78,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedLiterals = null;
+	protected EList<EnumerationLiteral> ownedLiterals = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -81,6 +94,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ENUMERATION;
 	}
@@ -90,25 +104,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.ENUMERATION__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.ENUMERATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.ENUMERATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -116,9 +131,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedLiterals() {
+	public EList<EnumerationLiteral> getOwnedLiterals() {
 		if (ownedLiterals == null) {
-			ownedLiterals = new EObjectContainmentWithInverseEList.Resolving(
+			ownedLiterals = new EObjectContainmentWithInverseEList.Resolving<EnumerationLiteral>(
 				EnumerationLiteral.class, this,
 				UMLPackage.ENUMERATION__OWNED_LITERAL,
 				UMLPackage.ENUMERATION_LITERAL__ENUMERATION);
@@ -142,9 +157,7 @@
 	 */
 	public EnumerationLiteral getOwnedLiteral(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedLiteralLoop : for (Iterator i = getOwnedLiterals().iterator(); i
-			.hasNext();) {
-			EnumerationLiteral ownedLiteral = (EnumerationLiteral) i.next();
+		ownedLiteralLoop : for (EnumerationLiteral ownedLiteral : getOwnedLiterals()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedLiteral.getName())
 				: name.equals(ownedLiteral.getName())))
@@ -174,24 +187,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -206,8 +221,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -217,25 +232,26 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return ((InternalEList) getOwnedLiterals()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedLiterals())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -245,64 +261,65 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return ((InternalEList) getOwnedLiterals()).basicRemove(
+				return ((InternalEList<?>) getOwnedLiterals()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -313,6 +330,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
@@ -424,15 +442,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__NAME :
 				setName((String) newValue);
@@ -442,22 +464,26 @@
 				return;
 			case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -473,7 +499,8 @@
 				return;
 			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -483,50 +510,60 @@
 				return;
 			case UMLPackage.ENUMERATION__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.ENUMERATION__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.ENUMERATION__OWNED_LITERAL :
 				getOwnedLiterals().clear();
-				getOwnedLiterals().addAll((Collection) newValue);
+				getOwnedLiterals().addAll(
+					(Collection<? extends EnumerationLiteral>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -537,6 +574,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
@@ -632,6 +670,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION__EANNOTATIONS :
@@ -743,6 +782,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.ENUMERATION__OWNED_LITERAL);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationLiteralImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationLiteralImpl.java
index 67ee673..44e27b2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationLiteralImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EnumerationLiteralImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: EnumerationLiteralImpl.java,v 1.15 2006/11/14 18:02:18 khussey Exp $
+ * $Id: EnumerationLiteralImpl.java,v 1.16 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,6 +16,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -24,9 +25,14 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.Enumeration;
 import org.eclipse.uml2.uml.EnumerationLiteral;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.Slot;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -65,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.ENUMERATION_LITERAL;
 	}
@@ -150,18 +157,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -176,7 +185,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				return ((InternalEList) getSlots()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -190,29 +200,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getDeployments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				return ((InternalEList) getSlots()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getSlots()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
@@ -226,6 +238,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -246,6 +259,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
@@ -307,15 +321,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__NAME :
 				setName((String) newValue);
@@ -325,14 +343,16 @@
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -342,11 +362,12 @@
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER :
 				getClassifiers().clear();
-				getClassifiers().addAll((Collection) newValue);
+				getClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__SLOT :
 				getSlots().clear();
-				getSlots().addAll((Collection) newValue);
+				getSlots().addAll((Collection<? extends Slot>) newValue);
 				return;
 			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -363,6 +384,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
@@ -413,6 +435,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
@@ -477,6 +500,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EventImpl.java
index 53b77f6..c272cc3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/EventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: EventImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: EventImpl.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EVENT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExceptionHandlerImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExceptionHandlerImpl.java
index 8d0f6ea..b1fa9f3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExceptionHandlerImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExceptionHandlerImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExceptionHandlerImpl.java,v 1.14 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ExceptionHandlerImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,6 +33,7 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.ExecutableNode;
@@ -90,7 +91,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList exceptionTypes = null;
+	protected EList<Classifier> exceptionTypes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -106,6 +107,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXCEPTION_HANDLER;
 	}
@@ -215,9 +217,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExceptionTypes() {
+	public EList<Classifier> getExceptionTypes() {
 		if (exceptionTypes == null) {
-			exceptionTypes = new EObjectResolvingEList(Classifier.class, this,
+			exceptionTypes = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
 				UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE);
 		}
 		return exceptionTypes;
@@ -239,9 +242,7 @@
 	 */
 	public Classifier getExceptionType(String name, boolean ignoreCase,
 			EClass eClass) {
-		exceptionTypeLoop : for (Iterator i = getExceptionTypes().iterator(); i
-			.hasNext();) {
-			Classifier exceptionType = (Classifier) i.next();
+		exceptionTypeLoop : for (Classifier exceptionType : getExceptionTypes()) {
 			if (eClass != null && !eClass.isInstance(exceptionType))
 				continue exceptionTypeLoop;
 			if (name != null && !(ignoreCase
@@ -323,7 +324,7 @@
 	 * @generated
 	 */
 	public boolean validateExceptionBody(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ExceptionHandlerOperations.validateExceptionBody(this,
 			diagnostics, context);
 	}
@@ -333,7 +334,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateResultPins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateResultPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExceptionHandlerOperations.validateResultPins(this, diagnostics,
 			context);
 	}
@@ -343,7 +345,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOneInput(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOneInput(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExceptionHandlerOperations.validateOneInput(this, diagnostics,
 			context);
 	}
@@ -354,7 +357,7 @@
 	 * @generated
 	 */
 	public boolean validateEdgeSourceTarget(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ExceptionHandlerOperations.validateEdgeSourceTarget(this,
 			diagnostics, context);
 	}
@@ -364,12 +367,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -383,14 +388,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
 				return basicSetProtectedNode(null, msgs);
@@ -403,6 +409,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -419,6 +426,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
@@ -454,15 +462,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY :
 				setHandlerBody((ExecutableNode) newValue);
@@ -472,7 +484,8 @@
 				return;
 			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE :
 				getExceptionTypes().clear();
-				getExceptionTypes().addAll((Collection) newValue);
+				getExceptionTypes().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
 				setProtectedNode((ExecutableNode) newValue);
@@ -486,6 +499,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
@@ -515,6 +529,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
@@ -556,6 +571,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutableNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutableNodeImpl.java
index 954c0df..2c183c8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutableNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutableNodeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutableNodeImpl.java,v 1.18 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ExecutableNodeImpl.java,v 1.19 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -17,6 +17,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -29,9 +30,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.ExecutableNode;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -63,7 +70,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList handlers = null;
+	protected EList<ExceptionHandler> handlers = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -79,6 +86,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXECUTABLE_NODE;
 	}
@@ -88,23 +96,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -113,9 +123,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getHandlers() {
+	public EList<ExceptionHandler> getHandlers() {
 		if (handlers == null) {
-			handlers = new EObjectContainmentWithInverseEList.Resolving(
+			handlers = new EObjectContainmentWithInverseEList.Resolving<ExceptionHandler>(
 				ExceptionHandler.class, this,
 				UMLPackage.EXECUTABLE_NODE__HANDLER,
 				UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE);
@@ -139,15 +149,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -158,19 +170,20 @@
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetActivity((Activity) otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -180,18 +193,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
@@ -199,19 +213,19 @@
 			case UMLPackage.EXECUTABLE_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -222,6 +236,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
@@ -289,15 +304,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__NAME :
 				setName((String) newValue);
@@ -307,7 +326,8 @@
 				return;
 			case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -323,27 +343,34 @@
 				return;
 			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.EXECUTABLE_NODE__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -354,6 +381,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
@@ -410,6 +438,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
@@ -482,6 +511,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.EXECUTABLE_NODE__HANDLER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEnvironmentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEnvironmentImpl.java
index e61c6bd..6650667 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEnvironmentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEnvironmentImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionEnvironmentImpl.java,v 1.2 2005/11/23 20:01:20 khussey Exp $
+ * $Id: ExecutionEnvironmentImpl.java,v 1.3 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXECUTION_ENVIRONMENT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEventImpl.java
index 5bf01a1..508f2b8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionEventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionEventImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: ExecutionEventImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXECUTION_EVENT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionOccurrenceSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionOccurrenceSpecificationImpl.java
index aabc6d8..77a6e65 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionOccurrenceSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionOccurrenceSpecificationImpl.java
@@ -8,24 +8,29 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionOccurrenceSpecificationImpl.java,v 1.13 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ExecutionOccurrenceSpecificationImpl.java,v 1.14 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Event;
 import org.eclipse.uml2.uml.ExecutionEvent;
 import org.eclipse.uml2.uml.ExecutionOccurrenceSpecification;
 import org.eclipse.uml2.uml.ExecutionSpecification;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -72,6 +77,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION;
 	}
@@ -166,6 +172,7 @@
 
 	}
 
+	@Override
 	public void setEvent(Event newEvent) {
 
 		if (newEvent != null && !(newEvent instanceof ExecutionEvent)) {
@@ -189,6 +196,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -250,15 +258,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -268,18 +280,20 @@
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -289,14 +303,16 @@
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE :
 				getToBefores().clear();
-				getToBefores().addAll((Collection) newValue);
+				getToBefores().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EVENT :
 				setEvent((Event) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER :
 				getToAfters().clear();
-				getToAfters().addAll((Collection) newValue);
+				getToAfters().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION :
 				setExecution((ExecutionSpecification) newValue);
@@ -310,6 +326,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -363,6 +380,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionSpecificationImpl.java
index 3b0612c..ef2244a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExecutionSpecificationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionSpecificationImpl.java,v 1.13 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ExecutionSpecificationImpl.java,v 1.14 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,19 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ExecutionSpecification;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.OccurrenceSpecification;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -86,6 +91,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXECUTION_SPECIFICATION;
 	}
@@ -181,7 +187,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameLifeline(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameLifeline(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExecutionSpecificationOperations.validateSameLifeline(this,
 			diagnostics, context);
 	}
@@ -191,6 +198,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -248,15 +256,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -266,18 +278,20 @@
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -300,6 +314,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
@@ -347,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionNodeImpl.java
index bf21d48..9a81f45 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionNodeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpansionNodeImpl.java,v 1.16 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ExpansionNodeImpl.java,v 1.17 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,6 +16,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -24,10 +25,17 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ExpansionNode;
 import org.eclipse.uml2.uml.ExpansionRegion;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
+import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -87,6 +95,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXPANSION_NODE;
 	}
@@ -250,15 +259,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -269,17 +280,17 @@
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetActivity((Activity) otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
 				if (regionAsOutput != null)
 					msgs = ((InternalEObject) regionAsOutput).eInverseRemove(
@@ -301,18 +312,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
@@ -320,16 +332,16 @@
 			case UMLPackage.EXPANSION_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
 				return basicSetUpperBound(null, msgs);
@@ -346,6 +358,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
@@ -439,15 +452,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__NAME :
 				setName((String) newValue);
@@ -457,7 +474,8 @@
 				return;
 			case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -473,23 +491,29 @@
 				return;
 			case UMLPackage.EXPANSION_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__TYPE :
 				setType((Type) newValue);
@@ -505,7 +529,7 @@
 				return;
 			case UMLPackage.EXPANSION_NODE__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.EXPANSION_NODE__SELECTION :
 				setSelection((Behavior) newValue);
@@ -525,6 +549,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
@@ -602,6 +627,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionRegionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionRegionImpl.java
index adb76c2..09ad270 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionRegionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpansionRegionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpansionRegionImpl.java,v 1.17 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ExpansionRegionImpl.java,v 1.18 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,13 +32,24 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.ExpansionKind;
 import org.eclipse.uml2.uml.ExpansionNode;
 import org.eclipse.uml2.uml.ExpansionRegion;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.ExpansionRegionOperations;
@@ -90,7 +101,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inputElements = null;
+	protected EList<ExpansionNode> inputElements = null;
 
 	/**
 	 * The cached value of the '{@link #getOutputElements() <em>Output Element</em>}' reference list.
@@ -100,7 +111,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList outputElements = null;
+	protected EList<ExpansionNode> outputElements = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -116,6 +127,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXPANSION_REGION;
 	}
@@ -151,9 +163,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputElements() {
+	public EList<ExpansionNode> getInputElements() {
 		if (inputElements == null) {
-			inputElements = new EObjectWithInverseResolvingEList(
+			inputElements = new EObjectWithInverseResolvingEList<ExpansionNode>(
 				ExpansionNode.class, this,
 				UMLPackage.EXPANSION_REGION__INPUT_ELEMENT,
 				UMLPackage.EXPANSION_NODE__REGION_AS_INPUT);
@@ -177,9 +189,7 @@
 	 */
 	public ExpansionNode getInputElement(String name, Type type,
 			boolean ignoreCase) {
-		inputElementLoop : for (Iterator i = getInputElements().iterator(); i
-			.hasNext();) {
-			ExpansionNode inputElement = (ExpansionNode) i.next();
+		inputElementLoop : for (ExpansionNode inputElement : getInputElements()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(inputElement.getName())
 				: name.equals(inputElement.getName())))
@@ -196,9 +206,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputElements() {
+	public EList<ExpansionNode> getOutputElements() {
 		if (outputElements == null) {
-			outputElements = new EObjectWithInverseResolvingEList(
+			outputElements = new EObjectWithInverseResolvingEList<ExpansionNode>(
 				ExpansionNode.class, this,
 				UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT,
 				UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT);
@@ -222,9 +232,7 @@
 	 */
 	public ExpansionNode getOutputElement(String name, Type type,
 			boolean ignoreCase) {
-		outputElementLoop : for (Iterator i = getOutputElements().iterator(); i
-			.hasNext();) {
-			ExpansionNode outputElement = (ExpansionNode) i.next();
+		outputElementLoop : for (ExpansionNode outputElement : getOutputElements()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(outputElement.getName())
 				: name.equals(outputElement.getName())))
@@ -242,7 +250,7 @@
 	 * @generated
 	 */
 	public boolean validateExpansionNodes(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ExpansionRegionOperations.validateExpansionNodes(this,
 			diagnostics, context);
 	}
@@ -252,15 +260,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -271,45 +281,48 @@
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetActivity((Activity) otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return ((InternalEList) getHandlers()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetInActivity((Activity) otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return ((InternalEList) getVariables())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__EDGE :
-				return ((InternalEList) getEdges()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__NODE :
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return ((InternalEList) getInputElements()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInputElements())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return ((InternalEList) getOutputElements()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutputElements())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -319,18 +332,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
@@ -338,49 +352,51 @@
 			case UMLPackage.EXPANSION_REGION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.EXPANSION_REGION__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return ((InternalEList) getInputElements()).basicRemove(
+				return ((InternalEList<?>) getInputElements()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return ((InternalEList) getOutputElements()).basicRemove(
+				return ((InternalEList<?>) getOutputElements()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -391,6 +407,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
@@ -512,15 +529,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__NAME :
 				setName((String) newValue);
@@ -530,7 +551,8 @@
 				return;
 			case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -546,76 +568,93 @@
 				return;
 			case UMLPackage.EXPANSION_REGION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__MUST_ISOLATE :
 				setMustIsolate(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.EXPANSION_REGION__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__MODE :
 				setMode((ExpansionKind) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
 				getInputElements().clear();
-				getInputElements().addAll((Collection) newValue);
+				getInputElements().addAll(
+					(Collection<? extends ExpansionNode>) newValue);
 				return;
 			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
 				getOutputElements().clear();
-				getOutputElements().addAll((Collection) newValue);
+				getOutputElements().addAll(
+					(Collection<? extends ExpansionNode>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -626,6 +665,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
@@ -721,6 +761,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
@@ -828,6 +869,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpressionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpressionImpl.java
index 911d654..589d4ad 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpressionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExpressionImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpressionImpl.java,v 1.18 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ExpressionImpl.java,v 1.19 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,6 +32,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Expression;
 import org.eclipse.uml2.uml.StringExpression;
@@ -97,7 +99,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList operands = null;
+	protected EList<ValueSpecification> operands = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -113,6 +115,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXPRESSION;
 	}
@@ -122,23 +125,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.EXPRESSION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.EXPRESSION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -199,9 +204,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOperands() {
+	public EList<ValueSpecification> getOperands() {
 		if (operands == null) {
-			operands = new EObjectContainmentEList.Resolving(
+			operands = new EObjectContainmentEList.Resolving<ValueSpecification>(
 				ValueSpecification.class, this, UMLPackage.EXPRESSION__OPERAND);
 		}
 		return operands;
@@ -239,8 +244,7 @@
 	 */
 	public ValueSpecification getOperand(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		operandLoop : for (Iterator i = getOperands().iterator(); i.hasNext();) {
-			ValueSpecification operand = (ValueSpecification) i.next();
+		operandLoop : for (ValueSpecification operand : getOperands()) {
 			if (eClass != null && !eClass.isInstance(operand))
 				continue operandLoop;
 			if (name != null && !(ignoreCase
@@ -261,18 +265,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
@@ -280,7 +285,7 @@
 			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.EXPRESSION__OPERAND :
-				return ((InternalEList) getOperands()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -291,6 +296,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXPRESSION__EANNOTATIONS :
@@ -344,15 +350,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXPRESSION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXPRESSION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXPRESSION__NAME :
 				setName((String) newValue);
@@ -362,7 +372,8 @@
 				return;
 			case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -381,7 +392,8 @@
 				return;
 			case UMLPackage.EXPRESSION__OPERAND :
 				getOperands().clear();
-				getOperands().addAll((Collection) newValue);
+				getOperands().addAll(
+					(Collection<? extends ValueSpecification>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -392,6 +404,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPRESSION__EANNOTATIONS :
@@ -436,6 +449,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXPRESSION__EANNOTATIONS :
@@ -480,6 +494,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -511,6 +526,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.EXPRESSION__OPERAND);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtendImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtendImpl.java
index 3a77c47..b9a87e0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtendImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtendImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtendImpl.java,v 1.20 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ExtendImpl.java,v 1.21 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Extend;
@@ -102,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList extensionLocations = null;
+	protected EList<ExtensionPoint> extensionLocations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -118,6 +120,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXTEND;
 	}
@@ -127,24 +130,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.EXTEND__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXTEND__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
@@ -153,22 +158,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.EXTEND__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.EXTEND__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXTEND__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -177,22 +184,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.EXTEND__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.EXTEND__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXTEND__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -201,23 +210,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.EXTEND__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.EXTEND__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.EXTEND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -377,9 +387,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtensionLocations() {
+	public EList<ExtensionPoint> getExtensionLocations() {
 		if (extensionLocations == null) {
-			extensionLocations = new EObjectResolvingEList(
+			extensionLocations = new EObjectResolvingEList<ExtensionPoint>(
 				ExtensionPoint.class, this,
 				UMLPackage.EXTEND__EXTENSION_LOCATION);
 		}
@@ -401,9 +411,7 @@
 	 * @generated
 	 */
 	public ExtensionPoint getExtensionLocation(String name, boolean ignoreCase) {
-		extensionLocationLoop : for (Iterator i = getExtensionLocations()
-			.iterator(); i.hasNext();) {
-			ExtensionPoint extensionLocation = (ExtensionPoint) i.next();
+		extensionLocationLoop : for (ExtensionPoint extensionLocation : getExtensionLocations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(extensionLocation.getName())
 				: name.equals(extensionLocation.getName())))
@@ -481,7 +489,7 @@
 	 * @generated
 	 */
 	public boolean validateExtensionPoints(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ExtendOperations.validateExtensionPoints(this, diagnostics,
 			context);
 	}
@@ -491,15 +499,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXTEND__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXTEND__EXTENSION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -513,18 +523,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXTEND__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXTEND__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXTEND__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXTEND__CONDITION :
@@ -540,6 +551,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -555,6 +567,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
@@ -612,15 +625,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXTEND__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXTEND__NAME :
 				setName((String) newValue);
@@ -630,7 +647,8 @@
 				return;
 			case UMLPackage.EXTEND__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXTEND__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -643,7 +661,8 @@
 				return;
 			case UMLPackage.EXTEND__EXTENSION_LOCATION :
 				getExtensionLocations().clear();
-				getExtensionLocations().addAll((Collection) newValue);
+				getExtensionLocations().addAll(
+					(Collection<? extends ExtensionPoint>) newValue);
 				return;
 			case UMLPackage.EXTEND__EXTENSION :
 				setExtension((UseCase) newValue);
@@ -657,6 +676,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
@@ -698,6 +718,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTEND__EANNOTATIONS :
@@ -747,7 +768,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.EXTEND__RELATED_ELEMENT :
@@ -774,7 +796,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
@@ -871,6 +894,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.EXTEND__CONDITION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionEndImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionEndImpl.java
index ef4fab5..8fb58fc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionEndImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionEndImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionEndImpl.java,v 1.20 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ExtensionEndImpl.java,v 1.21 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -61,6 +61,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXTENSION_END;
 	}
@@ -150,7 +151,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExtensionEndOperations.validateMultiplicity(this, diagnostics,
 			context);
 	}
@@ -160,7 +162,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAggregation(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAggregation(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExtensionEndOperations.validateAggregation(this, diagnostics,
 			context);
 	}
@@ -179,6 +182,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_END__EANNOTATIONS :
@@ -328,6 +332,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_END__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionImpl.java
index 3d2090c..dc50d3d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionImpl.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionImpl.java,v 1.25 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ExtensionImpl.java,v 1.26 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -77,6 +76,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXTENSION;
 	}
@@ -86,18 +86,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedEndsGen() {
+	public EList<Property> getOwnedEndsGen() {
 		if (ownedEnds == null) {
-			ownedEnds = new EObjectContainmentWithInverseEList.Resolving(
+			ownedEnds = new EObjectContainmentWithInverseEList.Resolving<Property>(
 				ExtensionEnd.class, this, UMLPackage.EXTENSION__OWNED_END,
 				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 		}
 		return ownedEnds;
 	}
 
-	public EList getOwnedEnds() {
+	@Override
+	public EList<Property> getOwnedEnds() {
 		if (ownedEnds == null) {
-			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedEnds = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
 				ExtensionEnd.class, this, UMLPackage.EXTENSION__OWNED_END,
 				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
 				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
@@ -110,6 +111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property createOwnedEnd(String name, Type type) {
 		ExtensionEnd newOwnedEnd = (ExtensionEnd) create(UMLPackage.Literals.EXTENSION_END);
 		getOwnedEnds().add(newOwnedEnd);
@@ -125,6 +127,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Property getOwnedEnd(String name, Type type) {
 		return getOwnedEnd(name, type, false, false);
 	}
@@ -136,8 +139,7 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedEndLoop : for (Iterator i = getOwnedEnds().iterator(); i.hasNext();) {
-			ExtensionEnd ownedEnd = (ExtensionEnd) i.next();
+		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedEnd.getName())
 				: name.equals(ownedEnd.getName())))
@@ -197,7 +199,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNonOwnedEnd(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNonOwnedEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExtensionOperations.validateNonOwnedEnd(this, diagnostics,
 			context);
 	}
@@ -207,7 +210,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateIsBinary(DiagnosticChain diagnostics, Map context) {
+	public boolean validateIsBinary(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExtensionOperations.validateIsBinary(this, diagnostics, context);
 	}
 
@@ -243,6 +247,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION__EANNOTATIONS :
@@ -370,6 +375,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionPointImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionPointImpl.java
index 325b7fd..1d19f1c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionPointImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ExtensionPointImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionPointImpl.java,v 1.14 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ExtensionPointImpl.java,v 1.15 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ExtensionPoint;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -67,6 +70,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.EXTENSION_POINT;
 	}
@@ -138,7 +142,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMustHaveName(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ExtensionPointOperations.validateMustHaveName(this, diagnostics,
 			context);
 	}
@@ -148,15 +153,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.EXTENSION_POINT__USE_CASE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -170,18 +177,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.EXTENSION_POINT__USE_CASE :
@@ -195,6 +203,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -210,6 +219,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
@@ -259,15 +269,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.EXTENSION_POINT__NAME :
 				setName((String) newValue);
@@ -277,7 +291,8 @@
 				return;
 			case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -297,6 +312,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
@@ -332,6 +348,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FeatureImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FeatureImpl.java
index 4c05fdc..4df2fbb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FeatureImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FeatureImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FeatureImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: FeatureImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
@@ -27,6 +27,8 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Feature;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -84,6 +86,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FEATURE;
 	}
@@ -93,23 +96,28 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeaturingClassifiersGen() {
+	public EList<Classifier> getFeaturingClassifiersGen() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.FEATURE__FEATURING_CLASSIFIER, null));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class, this,
+							UMLPackage.FEATURE__FEATURING_CLASSIFIER, null));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.FEATURE__FEATURING_CLASSIFIER, null);
 	}
 
@@ -119,23 +127,28 @@
 	 */
 	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{UMLPackage.FEATURE__NAMESPACE};
 
-	public EList getFeaturingClassifiers() {
+	public EList<Classifier> getFeaturingClassifiers() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.FEATURE__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class, this,
+							UMLPackage.FEATURE__FEATURING_CLASSIFIER,
+							FEATURING_CLASSIFIER_ESUBSETS));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.FEATURE__FEATURING_CLASSIFIER,
 			FEATURING_CLASSIFIER_ESUBSETS);
 	}
@@ -156,9 +169,7 @@
 	 */
 	public Classifier getFeaturingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		featuringClassifierLoop : for (Iterator i = getFeaturingClassifiers()
-			.iterator(); i.hasNext();) {
-			Classifier featuringClassifier = (Classifier) i.next();
+		featuringClassifierLoop : for (Classifier featuringClassifier : getFeaturingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(featuringClassifier))
 				continue featuringClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -202,6 +213,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.FEATURE__EANNOTATIONS :
@@ -253,15 +265,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.FEATURE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.FEATURE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.FEATURE__NAME :
 				setName((String) newValue);
@@ -271,7 +287,8 @@
 				return;
 			case UMLPackage.FEATURE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.FEATURE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -291,6 +308,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.FEATURE__EANNOTATIONS :
@@ -326,6 +344,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.FEATURE__EANNOTATIONS :
@@ -370,6 +389,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalNodeImpl.java
index 2d841ba..2ceda98 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalNodeImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: FinalNodeImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FINAL_NODE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FinalNodeOperations.validateNoOutgoingEdges(this, diagnostics,
 			context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalStateImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalStateImpl.java
index 750927f..8378934 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalStateImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FinalStateImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalStateImpl.java,v 1.3 2006/02/23 17:20:47 khussey Exp $
+ * $Id: FinalStateImpl.java,v 1.4 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FINAL_STATE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateNoOutgoingTransitions(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FinalStateOperations.validateNoOutgoingTransitions(this,
 			diagnostics, context);
 	}
@@ -70,7 +71,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoRegions(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoRegions(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return FinalStateOperations.validateNoRegions(this, diagnostics,
 			context);
 	}
@@ -81,7 +83,7 @@
 	 * @generated
 	 */
 	public boolean validateCannotReferenceSubmachine(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return FinalStateOperations.validateCannotReferenceSubmachine(this,
 			diagnostics, context);
 	}
@@ -92,7 +94,7 @@
 	 * @generated
 	 */
 	public boolean validateNoEntryBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FinalStateOperations.validateNoEntryBehavior(this, diagnostics,
 			context);
 	}
@@ -103,7 +105,7 @@
 	 * @generated
 	 */
 	public boolean validateNoExitBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FinalStateOperations.validateNoExitBehavior(this, diagnostics,
 			context);
 	}
@@ -114,7 +116,7 @@
 	 * @generated
 	 */
 	public boolean validateNoStateBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FinalStateOperations.validateNoStateBehavior(this, diagnostics,
 			context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FlowFinalNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FlowFinalNodeImpl.java
index cd0bc0e..fc12222 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FlowFinalNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FlowFinalNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FlowFinalNodeImpl.java,v 1.2 2005/11/23 20:01:15 khussey Exp $
+ * $Id: FlowFinalNodeImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FLOW_FINAL_NODE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ForkNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ForkNodeImpl.java
index cdfc67b..c7d1629 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ForkNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ForkNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ForkNodeImpl.java,v 1.2 2005/11/23 20:01:17 khussey Exp $
+ * $Id: ForkNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FORK_NODE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateOneIncomingEdge(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ForkNodeOperations.validateOneIncomingEdge(this, diagnostics,
 			context);
 	}
@@ -70,7 +71,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ForkNodeOperations.validateEdges(this, diagnostics, context);
 	}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FunctionBehaviorImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FunctionBehaviorImpl.java
index 7284bf5..84da87e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FunctionBehaviorImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/FunctionBehaviorImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FunctionBehaviorImpl.java,v 1.2 2005/11/23 20:01:20 khussey Exp $
+ * $Id: FunctionBehaviorImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.FUNCTION_BEHAVIOR;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateOneOutputParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FunctionBehaviorOperations.validateOneOutputParameter(this,
 			diagnostics, context);
 	}
@@ -71,7 +72,7 @@
 	 * @generated
 	 */
 	public boolean validateTypesOfParameters(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return FunctionBehaviorOperations.validateTypesOfParameters(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GateImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GateImpl.java
index dc5a5df..98160ea 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GateImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GateImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GateImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: GateImpl.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.GATE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateMessagesActualGate(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return GateOperations.validateMessagesActualGate(this, diagnostics,
 			context);
 	}
@@ -71,7 +72,7 @@
 	 * @generated
 	 */
 	public boolean validateMessagesCombinedFragment(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return GateOperations.validateMessagesCombinedFragment(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralOrderingImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralOrderingImpl.java
index 6460267..72edb88 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralOrderingImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralOrderingImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralOrderingImpl.java,v 1.12 2006/11/14 18:02:18 khussey Exp $
+ * $Id: GeneralOrderingImpl.java,v 1.13 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,6 +16,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -23,6 +24,8 @@
 
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.OccurrenceSpecification;
 import org.eclipse.uml2.uml.StringExpression;
@@ -81,6 +84,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.GENERAL_ORDERING;
 	}
@@ -240,15 +244,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERAL_ORDERING__BEFORE :
 				if (before != null)
 					msgs = ((InternalEObject) before).eInverseRemove(this,
@@ -270,18 +276,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.GENERAL_ORDERING__BEFORE :
@@ -297,6 +304,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
@@ -342,15 +350,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.GENERAL_ORDERING__NAME :
 				setName((String) newValue);
@@ -360,7 +372,8 @@
 				return;
 			case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -380,6 +393,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
@@ -415,6 +429,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationImpl.java
index 244464f..ec791f4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralizationImpl.java,v 1.15 2006/11/14 18:02:20 khussey Exp $
+ * $Id: GeneralizationImpl.java,v 1.16 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -38,6 +38,7 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Generalization;
 import org.eclipse.uml2.uml.GeneralizationSet;
@@ -115,7 +116,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalizationSets = null;
+	protected EList<GeneralizationSet> generalizationSets = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -131,6 +132,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.GENERALIZATION;
 	}
@@ -140,22 +142,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.GENERALIZATION__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.GENERALIZATION__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.GENERALIZATION__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -164,22 +168,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.GENERALIZATION__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.GENERALIZATION__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.GENERALIZATION__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -289,9 +295,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralizationSets() {
+	public EList<GeneralizationSet> getGeneralizationSets() {
 		if (generalizationSets == null) {
-			generalizationSets = new EObjectWithInverseResolvingEList.ManyInverse(
+			generalizationSets = new EObjectWithInverseResolvingEList.ManyInverse<GeneralizationSet>(
 				GeneralizationSet.class, this,
 				UMLPackage.GENERALIZATION__GENERALIZATION_SET,
 				UMLPackage.GENERALIZATION_SET__GENERALIZATION);
@@ -315,9 +321,7 @@
 	 */
 	public GeneralizationSet getGeneralizationSet(String name,
 			boolean ignoreCase) {
-		generalizationSetLoop : for (Iterator i = getGeneralizationSets()
-			.iterator(); i.hasNext();) {
-			GeneralizationSet generalizationSet = (GeneralizationSet) i.next();
+		generalizationSetLoop : for (GeneralizationSet generalizationSet : getGeneralizationSets()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(generalizationSet.getName())
 				: name.equals(generalizationSet.getName())))
@@ -396,7 +400,7 @@
 	 * @generated
 	 */
 	public boolean validateGeneralizationSameClassifier(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return GeneralizationOperations.validateGeneralizationSameClassifier(
 			this, diagnostics, context);
 	}
@@ -406,15 +410,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return ((InternalEList) getGeneralizationSets()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizationSets())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION__SPECIFIC :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -428,18 +434,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return ((InternalEList) getGeneralizationSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getGeneralizationSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION__SPECIFIC :
 				return basicSetSpecific(null, msgs);
 		}
@@ -451,6 +458,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -467,6 +475,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
@@ -508,15 +517,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE :
 				setIsSubstitutable(((Boolean) newValue).booleanValue());
@@ -526,7 +539,8 @@
 				return;
 			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
 				getGeneralizationSets().clear();
-				getGeneralizationSets().addAll((Collection) newValue);
+				getGeneralizationSets().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION__SPECIFIC :
 				setSpecific((Classifier) newValue);
@@ -540,6 +554,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
@@ -569,6 +584,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION__EANNOTATIONS :
@@ -603,6 +619,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -632,6 +649,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.GENERALIZATION__GENERAL);
@@ -664,6 +682,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
@@ -688,6 +707,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationSetImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationSetImpl.java
index 6dfe5fc..e1577a7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationSetImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/GeneralizationSetImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralizationSetImpl.java,v 1.14 2006/11/14 18:02:16 khussey Exp $
+ * $Id: GeneralizationSetImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,6 +32,8 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Generalization;
 import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.StringExpression;
@@ -119,7 +121,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalizations = null;
+	protected EList<Generalization> generalizations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -135,6 +137,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.GENERALIZATION_SET;
 	}
@@ -277,9 +280,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralizations() {
+	public EList<Generalization> getGeneralizations() {
 		if (generalizations == null) {
-			generalizations = new EObjectWithInverseResolvingEList.ManyInverse(
+			generalizations = new EObjectWithInverseResolvingEList.ManyInverse<Generalization>(
 				Generalization.class, this,
 				UMLPackage.GENERALIZATION_SET__GENERALIZATION,
 				UMLPackage.GENERALIZATION__GENERALIZATION_SET);
@@ -293,9 +296,7 @@
 	 * @generated
 	 */
 	public Generalization getGeneralization(Classifier general) {
-		generalizationLoop : for (Iterator i = getGeneralizations().iterator(); i
-			.hasNext();) {
-			Generalization generalization = (Generalization) i.next();
+		generalizationLoop : for (Generalization generalization : getGeneralizations()) {
 			if (general != null && !general.equals(generalization.getGeneral()))
 				continue generalizationLoop;
 			return generalization;
@@ -309,7 +310,7 @@
 	 * @generated
 	 */
 	public boolean validateGeneralizationSameClassifier(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return GeneralizationSetOperations
 			.validateGeneralizationSameClassifier(this, diagnostics, context);
 	}
@@ -320,7 +321,7 @@
 	 * @generated
 	 */
 	public boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return GeneralizationSetOperations.validateMapsToGeneralizationSet(
 			this, diagnostics, context);
 	}
@@ -330,15 +331,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -359,8 +362,8 @@
 						Classifier.class, msgs);
 				return basicSetPowertype((Classifier) otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -370,18 +373,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
@@ -391,7 +395,7 @@
 			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
 				return basicSetPowertype(null, msgs);
 			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -402,6 +406,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
@@ -461,15 +466,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION_SET__NAME :
 				setName((String) newValue);
@@ -479,7 +488,8 @@
 				return;
 			case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -501,7 +511,8 @@
 				return;
 			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -512,6 +523,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
@@ -559,6 +571,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
@@ -605,6 +618,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ImageImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ImageImpl.java
index 4275c29..6ee9709 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ImageImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ImageImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ImageImpl.java,v 1.5 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ImageImpl.java,v 1.6 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,10 +16,12 @@
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Image;
 import org.eclipse.uml2.uml.UMLPackage;
 
@@ -143,6 +145,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.IMAGE;
 	}
@@ -306,6 +309,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.IMAGE__EANNOTATIONS :
@@ -333,15 +337,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.IMAGE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.IMAGE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.IMAGE__CONTENT :
 				setContent((String) newValue);
@@ -361,6 +369,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.IMAGE__EANNOTATIONS :
@@ -387,6 +396,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.IMAGE__EANNOTATIONS :
@@ -412,6 +422,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IncludeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IncludeImpl.java
index 3be6e01..d70d01e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IncludeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IncludeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: IncludeImpl.java,v 1.15 2006/11/14 18:02:18 khussey Exp $
+ * $Id: IncludeImpl.java,v 1.16 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,6 +32,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Include;
@@ -85,6 +88,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INCLUDE;
 	}
@@ -94,24 +98,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.INCLUDE__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INCLUDE__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
@@ -120,22 +126,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.INCLUDE__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.INCLUDE__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INCLUDE__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -144,22 +152,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.INCLUDE__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.INCLUDE__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INCLUDE__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -273,15 +283,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INCLUDE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INCLUDE__INCLUDING_CASE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -295,18 +307,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INCLUDE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INCLUDE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INCLUDE__INCLUDING_CASE :
@@ -320,6 +333,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -335,6 +349,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
@@ -386,15 +401,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INCLUDE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INCLUDE__NAME :
 				setName((String) newValue);
@@ -404,7 +423,8 @@
 				return;
 			case UMLPackage.INCLUDE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INCLUDE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -424,6 +444,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
@@ -459,6 +480,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INCLUDE__EANNOTATIONS :
@@ -503,7 +525,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.INCLUDE__RELATED_ELEMENT :
@@ -530,7 +553,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationFlowImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationFlowImpl.java
index 7e9c48e..a50abbd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationFlowImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationFlowImpl.java
@@ -8,18 +8,18 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationFlowImpl.java,v 1.13 2006/11/14 18:02:15 khussey Exp $
+ * $Id: InformationFlowImpl.java,v 1.14 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.resource.Resource;
 
@@ -30,7 +30,9 @@
 
 import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InformationFlow;
@@ -78,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList realizations = null;
+	protected EList<Relationship> realizations = null;
 
 	/**
 	 * The cached value of the '{@link #getConveyeds() <em>Conveyed</em>}' reference list.
@@ -88,7 +90,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList conveyeds = null;
+	protected EList<Classifier> conveyeds = null;
 
 	/**
 	 * The cached value of the '{@link #getInformationSources() <em>Information Source</em>}' reference list.
@@ -98,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList informationSources = null;
+	protected EList<NamedElement> informationSources = null;
 
 	/**
 	 * The cached value of the '{@link #getInformationTargets() <em>Information Target</em>}' reference list.
@@ -108,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList informationTargets = null;
+	protected EList<NamedElement> informationTargets = null;
 
 	/**
 	 * The cached value of the '{@link #getRealizingActivityEdges() <em>Realizing Activity Edge</em>}' reference list.
@@ -118,7 +120,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList realizingActivityEdges = null;
+	protected EList<ActivityEdge> realizingActivityEdges = null;
 
 	/**
 	 * The cached value of the '{@link #getRealizingConnectors() <em>Realizing Connector</em>}' reference list.
@@ -128,7 +130,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList realizingConnectors = null;
+	protected EList<Connector> realizingConnectors = null;
 
 	/**
 	 * The cached value of the '{@link #getRealizingMessages() <em>Realizing Message</em>}' reference list.
@@ -138,7 +140,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList realizingMessages = null;
+	protected EList<Message> realizingMessages = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -154,6 +156,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INFORMATION_FLOW;
 	}
@@ -163,24 +166,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT,
 						RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT,
 			RELATED_ELEMENT_ESUBSETS);
 	}
@@ -190,22 +195,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -214,22 +221,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -238,9 +247,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRealizations() {
+	public EList<Relationship> getRealizations() {
 		if (realizations == null) {
-			realizations = new EObjectResolvingEList(Relationship.class, this,
+			realizations = new EObjectResolvingEList<Relationship>(
+				Relationship.class, this,
 				UMLPackage.INFORMATION_FLOW__REALIZATION);
 		}
 		return realizations;
@@ -251,10 +261,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConveyeds() {
+	public EList<Classifier> getConveyeds() {
 		if (conveyeds == null) {
-			conveyeds = new EObjectResolvingEList(Classifier.class, this,
-				UMLPackage.INFORMATION_FLOW__CONVEYED);
+			conveyeds = new EObjectResolvingEList<Classifier>(Classifier.class,
+				this, UMLPackage.INFORMATION_FLOW__CONVEYED);
 		}
 		return conveyeds;
 	}
@@ -274,8 +284,7 @@
 	 * @generated
 	 */
 	public Classifier getConveyed(String name, boolean ignoreCase, EClass eClass) {
-		conveyedLoop : for (Iterator i = getConveyeds().iterator(); i.hasNext();) {
-			Classifier conveyed = (Classifier) i.next();
+		conveyedLoop : for (Classifier conveyed : getConveyeds()) {
 			if (eClass != null && !eClass.isInstance(conveyed))
 				continue conveyedLoop;
 			if (name != null && !(ignoreCase
@@ -292,10 +301,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInformationSources() {
+	public EList<NamedElement> getInformationSources() {
 		if (informationSources == null) {
-			informationSources = new EObjectResolvingEList(NamedElement.class,
-				this, UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE);
+			informationSources = new EObjectResolvingEList<NamedElement>(
+				NamedElement.class, this,
+				UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE);
 		}
 		return informationSources;
 	}
@@ -316,9 +326,7 @@
 	 */
 	public NamedElement getInformationSource(String name, boolean ignoreCase,
 			EClass eClass) {
-		informationSourceLoop : for (Iterator i = getInformationSources()
-			.iterator(); i.hasNext();) {
-			NamedElement informationSource = (NamedElement) i.next();
+		informationSourceLoop : for (NamedElement informationSource : getInformationSources()) {
 			if (eClass != null && !eClass.isInstance(informationSource))
 				continue informationSourceLoop;
 			if (name != null && !(ignoreCase
@@ -335,10 +343,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInformationTargets() {
+	public EList<NamedElement> getInformationTargets() {
 		if (informationTargets == null) {
-			informationTargets = new EObjectResolvingEList(NamedElement.class,
-				this, UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET);
+			informationTargets = new EObjectResolvingEList<NamedElement>(
+				NamedElement.class, this,
+				UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET);
 		}
 		return informationTargets;
 	}
@@ -359,9 +368,7 @@
 	 */
 	public NamedElement getInformationTarget(String name, boolean ignoreCase,
 			EClass eClass) {
-		informationTargetLoop : for (Iterator i = getInformationTargets()
-			.iterator(); i.hasNext();) {
-			NamedElement informationTarget = (NamedElement) i.next();
+		informationTargetLoop : for (NamedElement informationTarget : getInformationTargets()) {
 			if (eClass != null && !eClass.isInstance(informationTarget))
 				continue informationTargetLoop;
 			if (name != null && !(ignoreCase
@@ -378,9 +385,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRealizingActivityEdges() {
+	public EList<ActivityEdge> getRealizingActivityEdges() {
 		if (realizingActivityEdges == null) {
-			realizingActivityEdges = new EObjectResolvingEList(
+			realizingActivityEdges = new EObjectResolvingEList<ActivityEdge>(
 				ActivityEdge.class, this,
 				UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE);
 		}
@@ -403,9 +410,7 @@
 	 */
 	public ActivityEdge getRealizingActivityEdge(String name,
 			boolean ignoreCase, EClass eClass) {
-		realizingActivityEdgeLoop : for (Iterator i = getRealizingActivityEdges()
-			.iterator(); i.hasNext();) {
-			ActivityEdge realizingActivityEdge = (ActivityEdge) i.next();
+		realizingActivityEdgeLoop : for (ActivityEdge realizingActivityEdge : getRealizingActivityEdges()) {
 			if (eClass != null && !eClass.isInstance(realizingActivityEdge))
 				continue realizingActivityEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -422,10 +427,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRealizingConnectors() {
+	public EList<Connector> getRealizingConnectors() {
 		if (realizingConnectors == null) {
-			realizingConnectors = new EObjectResolvingEList(Connector.class,
-				this, UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR);
+			realizingConnectors = new EObjectResolvingEList<Connector>(
+				Connector.class, this,
+				UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR);
 		}
 		return realizingConnectors;
 	}
@@ -445,9 +451,7 @@
 	 * @generated
 	 */
 	public Connector getRealizingConnector(String name, boolean ignoreCase) {
-		realizingConnectorLoop : for (Iterator i = getRealizingConnectors()
-			.iterator(); i.hasNext();) {
-			Connector realizingConnector = (Connector) i.next();
+		realizingConnectorLoop : for (Connector realizingConnector : getRealizingConnectors()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(realizingConnector.getName())
 				: name.equals(realizingConnector.getName())))
@@ -462,9 +466,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRealizingMessages() {
+	public EList<Message> getRealizingMessages() {
 		if (realizingMessages == null) {
-			realizingMessages = new EObjectResolvingEList(Message.class, this,
+			realizingMessages = new EObjectResolvingEList<Message>(
+				Message.class, this,
 				UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE);
 		}
 		return realizingMessages;
@@ -485,9 +490,7 @@
 	 * @generated
 	 */
 	public Message getRealizingMessage(String name, boolean ignoreCase) {
-		realizingMessageLoop : for (Iterator i = getRealizingMessages()
-			.iterator(); i.hasNext();) {
-			Message realizingMessage = (Message) i.next();
+		realizingMessageLoop : for (Message realizingMessage : getRealizingMessages()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(realizingMessage.getName())
 				: name.equals(realizingMessage.getName())))
@@ -503,7 +506,7 @@
 	 * @generated
 	 */
 	public boolean validateSourcesAndTargetsKind(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InformationFlowOperations.validateSourcesAndTargetsKind(this,
 			diagnostics, context);
 	}
@@ -513,7 +516,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMustConform(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMustConform(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InformationFlowOperations.validateMustConform(this, diagnostics,
 			context);
 	}
@@ -524,7 +528,7 @@
 	 * @generated
 	 */
 	public boolean validateConveyClassifiers(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InformationFlowOperations.validateConveyClassifiers(this,
 			diagnostics, context);
 	}
@@ -534,6 +538,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
@@ -599,15 +604,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__NAME :
 				setName((String) newValue);
@@ -617,7 +626,8 @@
 				return;
 			case UMLPackage.INFORMATION_FLOW__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -630,31 +640,38 @@
 				return;
 			case UMLPackage.INFORMATION_FLOW__REALIZATION :
 				getRealizations().clear();
-				getRealizations().addAll((Collection) newValue);
+				getRealizations().addAll(
+					(Collection<? extends Relationship>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__CONVEYED :
 				getConveyeds().clear();
-				getConveyeds().addAll((Collection) newValue);
+				getConveyeds().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE :
 				getInformationSources().clear();
-				getInformationSources().addAll((Collection) newValue);
+				getInformationSources().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET :
 				getInformationTargets().clear();
-				getInformationTargets().addAll((Collection) newValue);
+				getInformationTargets().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE :
 				getRealizingActivityEdges().clear();
-				getRealizingActivityEdges().addAll((Collection) newValue);
+				getRealizingActivityEdges().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR :
 				getRealizingConnectors().clear();
-				getRealizingConnectors().addAll((Collection) newValue);
+				getRealizingConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE :
 				getRealizingMessages().clear();
-				getRealizingMessages().addAll((Collection) newValue);
+				getRealizingMessages().addAll(
+					(Collection<? extends Message>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -665,6 +682,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
@@ -721,6 +739,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
@@ -784,7 +803,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT :
@@ -811,7 +831,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationItemImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationItemImpl.java
index cb8d2e7..271bd65 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationItemImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InformationItemImpl.java
@@ -8,28 +8,38 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationItemImpl.java,v 1.16 2006/04/10 19:16:19 khussey Exp $
+ * $Id: InformationItemImpl.java,v 1.17 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.InformationItem;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.InformationItemOperations;
@@ -59,7 +69,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList representeds = null;
+	protected EList<Classifier> representeds = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -75,6 +85,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INFORMATION_ITEM;
 	}
@@ -84,9 +95,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRepresenteds() {
+	public EList<Classifier> getRepresenteds() {
 		if (representeds == null) {
-			representeds = new EObjectResolvingEList(Classifier.class, this,
+			representeds = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
 				UMLPackage.INFORMATION_ITEM__REPRESENTED);
 		}
 		return representeds;
@@ -108,9 +120,7 @@
 	 */
 	public Classifier getRepresented(String name, boolean ignoreCase,
 			EClass eClass) {
-		representedLoop : for (Iterator i = getRepresenteds().iterator(); i
-			.hasNext();) {
-			Classifier represented = (Classifier) i.next();
+		representedLoop : for (Classifier represented : getRepresenteds()) {
 			if (eClass != null && !eClass.isInstance(represented))
 				continue representedLoop;
 			if (name != null && !(ignoreCase
@@ -128,7 +138,7 @@
 	 * @generated
 	 */
 	public boolean validateSourcesAndTargets(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InformationItemOperations.validateSourcesAndTargets(this,
 			diagnostics, context);
 	}
@@ -138,7 +148,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateHasNo(DiagnosticChain diagnostics, Map context) {
+	public boolean validateHasNo(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InformationItemOperations.validateHasNo(this, diagnostics,
 			context);
 	}
@@ -149,7 +160,7 @@
 	 * @generated
 	 */
 	public boolean validateNotInstantiable(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InformationItemOperations.validateNotInstantiable(this,
 			diagnostics, context);
 	}
@@ -159,6 +170,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
@@ -266,15 +278,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__NAME :
 				setName((String) newValue);
@@ -284,22 +300,26 @@
 				return;
 			case UMLPackage.INFORMATION_ITEM__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -315,7 +335,8 @@
 				return;
 			case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -325,42 +346,50 @@
 				return;
 			case UMLPackage.INFORMATION_ITEM__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INFORMATION_ITEM__REPRESENTED :
 				getRepresenteds().clear();
-				getRepresenteds().addAll((Collection) newValue);
+				getRepresenteds().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -371,6 +400,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
@@ -460,6 +490,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InitialNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InitialNodeImpl.java
index aabed72..cde0710 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InitialNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InitialNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InitialNodeImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: InitialNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INITIAL_NODE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InitialNodeOperations.validateNoIncomingEdges(this, diagnostics,
 			context);
 	}
@@ -70,7 +71,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateControlEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateControlEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InitialNodeOperations.validateControlEdges(this, diagnostics,
 			context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InputPinImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InputPinImpl.java
index 7c20e5a..acf3327 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InputPinImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InputPinImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InputPinImpl.java,v 1.3 2006/05/16 15:07:26 khussey Exp $
+ * $Id: InputPinImpl.java,v 1.4 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INPUT_PIN;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateOutgoingEdgesStructuredOnly(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return InputPinOperations.validateOutgoingEdgesStructuredOnly(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceSpecificationImpl.java
index b4a1d0c..c523a03 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceSpecificationImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InstanceSpecificationImpl.java,v 1.18 2006/11/14 18:02:19 khussey Exp $
+ * $Id: InstanceSpecificationImpl.java,v 1.19 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -39,7 +39,10 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.DeployedArtifact;
+import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InstanceSpecification;
 import org.eclipse.uml2.uml.PackageableElement;
@@ -97,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList classifiers = null;
+	protected EList<Classifier> classifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getSlots() <em>Slot</em>}' containment reference list.
@@ -107,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList slots = null;
+	protected EList<Slot> slots = null;
 
 	/**
 	 * The cached value of the '{@link #getSpecification() <em>Specification</em>}' containment reference.
@@ -133,6 +136,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INSTANCE_SPECIFICATION;
 	}
@@ -352,23 +356,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -378,9 +384,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClassifiers() {
+	public EList<Classifier> getClassifiers() {
 		if (classifiers == null) {
-			classifiers = new EObjectResolvingEList(Classifier.class, this,
+			classifiers = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
 				UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER);
 		}
 		return classifiers;
@@ -402,9 +409,7 @@
 	 */
 	public Classifier getClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		classifierLoop : for (Iterator i = getClassifiers().iterator(); i
-			.hasNext();) {
-			Classifier classifier = (Classifier) i.next();
+		classifierLoop : for (Classifier classifier : getClassifiers()) {
 			if (eClass != null && !eClass.isInstance(classifier))
 				continue classifierLoop;
 			if (name != null && !(ignoreCase
@@ -530,9 +535,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSlots() {
+	public EList<Slot> getSlots() {
 		if (slots == null) {
-			slots = new EObjectContainmentWithInverseEList.Resolving(
+			slots = new EObjectContainmentWithInverseEList.Resolving<Slot>(
 				Slot.class, this, UMLPackage.INSTANCE_SPECIFICATION__SLOT,
 				UMLPackage.SLOT__OWNING_INSTANCE);
 		}
@@ -574,7 +579,7 @@
 	 * @generated
 	 */
 	public boolean validateDefiningFeature(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InstanceSpecificationOperations.validateDefiningFeature(this,
 			diagnostics, context);
 	}
@@ -585,7 +590,7 @@
 	 * @generated
 	 */
 	public boolean validateStructuralFeature(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InstanceSpecificationOperations.validateStructuralFeature(this,
 			diagnostics, context);
 	}
@@ -596,7 +601,7 @@
 	 * @generated
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InstanceSpecificationOperations.validateDeploymentTarget(this,
 			diagnostics, context);
 	}
@@ -607,7 +612,7 @@
 	 * @generated
 	 */
 	public boolean validateDeploymentArtifact(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InstanceSpecificationOperations.validateDeploymentArtifact(this,
 			diagnostics, context);
 	}
@@ -617,18 +622,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -643,7 +650,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				return ((InternalEList) getSlots()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -653,29 +661,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getDeployments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				return ((InternalEList) getSlots()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getSlots()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 		}
@@ -687,6 +697,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -703,6 +714,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
@@ -760,15 +772,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -778,14 +794,16 @@
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -795,11 +813,12 @@
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER :
 				getClassifiers().clear();
-				getClassifiers().addAll((Collection) newValue);
+				getClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
 				getSlots().clear();
-				getSlots().addAll((Collection) newValue);
+				getSlots().addAll((Collection<? extends Slot>) newValue);
 				return;
 			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -813,6 +832,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
@@ -860,6 +880,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
@@ -908,7 +929,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
@@ -939,7 +961,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -970,6 +993,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1000,6 +1024,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER);
@@ -1025,6 +1050,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__SLOT)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceValueImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceValueImpl.java
index edb3df8..8680a9d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceValueImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InstanceValueImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InstanceValueImpl.java,v 1.12 2006/11/14 18:02:18 khussey Exp $
+ * $Id: InstanceValueImpl.java,v 1.13 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.InstanceSpecification;
 import org.eclipse.uml2.uml.InstanceValue;
 import org.eclipse.uml2.uml.StringExpression;
@@ -71,6 +74,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INSTANCE_VALUE;
 	}
@@ -132,6 +136,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
@@ -185,15 +190,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INSTANCE_VALUE__NAME :
 				setName((String) newValue);
@@ -203,7 +212,8 @@
 				return;
 			case UMLPackage.INSTANCE_VALUE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -229,6 +239,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
@@ -270,6 +281,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionConstraintImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionConstraintImpl.java
index 95aae23..82948d2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionConstraintImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionConstraintImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionConstraintImpl.java,v 1.20 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InteractionConstraintImpl.java,v 1.21 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,6 +35,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InteractionConstraint;
 import org.eclipse.uml2.uml.Namespace;
@@ -99,6 +102,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERACTION_CONSTRAINT;
 	}
@@ -108,23 +112,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -341,7 +347,7 @@
 	 * @generated
 	 */
 	public boolean validateDynamicVariables(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionConstraintOperations.validateDynamicVariables(this,
 			diagnostics, context);
 	}
@@ -351,7 +357,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGlobalData(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGlobalData(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InteractionConstraintOperations.validateGlobalData(this,
 			diagnostics, context);
 	}
@@ -361,7 +368,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMinintMaxint(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMinintMaxint(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InteractionConstraintOperations.validateMinintMaxint(this,
 			diagnostics, context);
 	}
@@ -372,7 +380,7 @@
 	 * @generated
 	 */
 	public boolean validateMinintNonNegative(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionConstraintOperations.validateMinintNonNegative(this,
 			diagnostics, context);
 	}
@@ -383,7 +391,7 @@
 	 * @generated
 	 */
 	public boolean validateMaxintPositive(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionConstraintOperations.validateMaxintPositive(this,
 			diagnostics, context);
 	}
@@ -394,7 +402,7 @@
 	 * @generated
 	 */
 	public boolean validateMaxintGreaterEqualMinint(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return InteractionConstraintOperations
 			.validateMaxintGreaterEqualMinint(this, diagnostics, context);
 	}
@@ -404,18 +412,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
@@ -439,6 +448,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
@@ -502,15 +512,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__NAME :
 				setName((String) newValue);
@@ -520,7 +534,8 @@
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -533,7 +548,8 @@
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT :
 				getConstrainedElements().clear();
-				getConstrainedElements().addAll((Collection) newValue);
+				getConstrainedElements().addAll(
+					(Collection<? extends Element>) newValue);
 				return;
 			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -556,6 +572,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
@@ -606,6 +623,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
@@ -670,6 +688,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INTERACTION_CONSTRAINT__MININT)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionFragmentImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionFragmentImpl.java
index ac7bd68..e2574bc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionFragmentImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionFragmentImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionFragmentImpl.java,v 1.19 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InteractionFragmentImpl.java,v 1.20 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,6 +34,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
@@ -75,7 +77,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList covereds = null;
+	protected EList<Lifeline> covereds = null;
 
 	/**
 	 * The cached value of the '{@link #getGeneralOrderings() <em>General Ordering</em>}' containment reference list.
@@ -85,7 +87,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalOrderings = null;
+	protected EList<GeneralOrdering> generalOrderings = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -101,6 +103,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERACTION_FRAGMENT;
 	}
@@ -110,23 +113,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -136,9 +141,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCovereds() {
+	public EList<Lifeline> getCovereds() {
 		if (covereds == null) {
-			covereds = new EObjectWithInverseResolvingEList.ManyInverse(
+			covereds = new EObjectWithInverseResolvingEList.ManyInverse<Lifeline>(
 				Lifeline.class, this, UMLPackage.INTERACTION_FRAGMENT__COVERED,
 				UMLPackage.LIFELINE__COVERED_BY);
 		}
@@ -160,8 +165,7 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Iterator i = getCovereds().iterator(); i.hasNext();) {
-			Lifeline covered = (Lifeline) i.next();
+		coveredLoop : for (Lifeline covered : getCovereds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(covered.getName())
 				: name.equals(covered.getName())))
@@ -176,9 +180,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralOrderings() {
+	public EList<GeneralOrdering> getGeneralOrderings() {
 		if (generalOrderings == null) {
-			generalOrderings = new EObjectContainmentEList.Resolving(
+			generalOrderings = new EObjectContainmentEList.Resolving<GeneralOrdering>(
 				GeneralOrdering.class, this,
 				UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING);
 		}
@@ -214,9 +218,7 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (Iterator i = getGeneralOrderings()
-			.iterator(); i.hasNext();) {
-			GeneralOrdering generalOrdering = (GeneralOrdering) i.next();
+		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(generalOrdering.getName())
 				: name.equals(generalOrdering.getName())))
@@ -361,17 +363,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return ((InternalEList) getCovereds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -391,25 +396,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
@@ -424,6 +430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -443,6 +450,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
@@ -492,15 +500,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__NAME :
 				setName((String) newValue);
@@ -510,18 +522,20 @@
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -538,6 +552,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
@@ -579,6 +594,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
@@ -646,6 +662,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING);
@@ -670,6 +687,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionImpl.java
index 39294b2..05bf8e2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionImpl.java,v 1.27 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InteractionImpl.java,v 1.28 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -38,21 +38,41 @@
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Gate;
 import org.eclipse.uml2.uml.GeneralOrdering;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionFragment;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.Message;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 /**
@@ -91,7 +111,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList covereds = null;
+	protected EList<Lifeline> covereds = null;
 
 	/**
 	 * The cached value of the '{@link #getGeneralOrderings() <em>General Ordering</em>}' containment reference list.
@@ -101,7 +121,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalOrderings = null;
+	protected EList<GeneralOrdering> generalOrderings = null;
 
 	/**
 	 * The cached value of the '{@link #getLifelines() <em>Lifeline</em>}' containment reference list.
@@ -111,7 +131,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList lifelines = null;
+	protected EList<Lifeline> lifelines = null;
 
 	/**
 	 * The cached value of the '{@link #getFragments() <em>Fragment</em>}' containment reference list.
@@ -121,7 +141,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList fragments = null;
+	protected EList<InteractionFragment> fragments = null;
 
 	/**
 	 * The cached value of the '{@link #getActions() <em>Action</em>}' containment reference list.
@@ -131,7 +151,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList actions = null;
+	protected EList<Action> actions = null;
 
 	/**
 	 * The cached value of the '{@link #getFormalGates() <em>Formal Gate</em>}' containment reference list.
@@ -141,7 +161,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList formalGates = null;
+	protected EList<Gate> formalGates = null;
 
 	/**
 	 * The cached value of the '{@link #getMessages() <em>Message</em>}' containment reference list.
@@ -151,7 +171,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList messages = null;
+	protected EList<Message> messages = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -167,6 +187,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERACTION;
 	}
@@ -176,23 +197,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INTERACTION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INTERACTION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INTERACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -201,9 +224,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCovereds() {
+	public EList<Lifeline> getCovereds() {
 		if (covereds == null) {
-			covereds = new EObjectWithInverseResolvingEList.ManyInverse(
+			covereds = new EObjectWithInverseResolvingEList.ManyInverse<Lifeline>(
 				Lifeline.class, this, UMLPackage.INTERACTION__COVERED,
 				UMLPackage.LIFELINE__COVERED_BY);
 		}
@@ -225,8 +248,7 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Iterator i = getCovereds().iterator(); i.hasNext();) {
-			Lifeline covered = (Lifeline) i.next();
+		coveredLoop : for (Lifeline covered : getCovereds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(covered.getName())
 				: name.equals(covered.getName())))
@@ -241,9 +263,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralOrderings() {
+	public EList<GeneralOrdering> getGeneralOrderings() {
 		if (generalOrderings == null) {
-			generalOrderings = new EObjectContainmentEList.Resolving(
+			generalOrderings = new EObjectContainmentEList.Resolving<GeneralOrdering>(
 				GeneralOrdering.class, this,
 				UMLPackage.INTERACTION__GENERAL_ORDERING);
 		}
@@ -279,9 +301,7 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (Iterator i = getGeneralOrderings()
-			.iterator(); i.hasNext();) {
-			GeneralOrdering generalOrdering = (GeneralOrdering) i.next();
+		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(generalOrdering.getName())
 				: name.equals(generalOrdering.getName())))
@@ -426,25 +446,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.INTERACTION__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.INTERACTION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.INTERACTION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -452,9 +473,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLifelines() {
+	public EList<Lifeline> getLifelines() {
 		if (lifelines == null) {
-			lifelines = new EObjectContainmentWithInverseEList.Resolving(
+			lifelines = new EObjectContainmentWithInverseEList.Resolving<Lifeline>(
 				Lifeline.class, this, UMLPackage.INTERACTION__LIFELINE,
 				UMLPackage.LIFELINE__INTERACTION);
 		}
@@ -490,8 +511,7 @@
 	 */
 	public Lifeline getLifeline(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		lifelineLoop : for (Iterator i = getLifelines().iterator(); i.hasNext();) {
-			Lifeline lifeline = (Lifeline) i.next();
+		lifelineLoop : for (Lifeline lifeline : getLifelines()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(lifeline.getName())
 				: name.equals(lifeline.getName())))
@@ -508,9 +528,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFragments() {
+	public EList<InteractionFragment> getFragments() {
 		if (fragments == null) {
-			fragments = new EObjectContainmentWithInverseEList.Resolving(
+			fragments = new EObjectContainmentWithInverseEList.Resolving<InteractionFragment>(
 				InteractionFragment.class, this,
 				UMLPackage.INTERACTION__FRAGMENT,
 				UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION);
@@ -547,8 +567,7 @@
 	 */
 	public InteractionFragment getFragment(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		fragmentLoop : for (Iterator i = getFragments().iterator(); i.hasNext();) {
-			InteractionFragment fragment = (InteractionFragment) i.next();
+		fragmentLoop : for (InteractionFragment fragment : getFragments()) {
 			if (eClass != null && !eClass.isInstance(fragment))
 				continue fragmentLoop;
 			if (name != null && !(ignoreCase
@@ -567,10 +586,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getActions() {
+	public EList<Action> getActions() {
 		if (actions == null) {
-			actions = new EObjectContainmentEList.Resolving(Action.class, this,
-				UMLPackage.INTERACTION__ACTION);
+			actions = new EObjectContainmentEList.Resolving<Action>(
+				Action.class, this, UMLPackage.INTERACTION__ACTION);
 		}
 		return actions;
 	}
@@ -604,8 +623,7 @@
 	 */
 	public Action getAction(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		actionLoop : for (Iterator i = getActions().iterator(); i.hasNext();) {
-			Action action = (Action) i.next();
+		actionLoop : for (Action action : getActions()) {
 			if (eClass != null && !eClass.isInstance(action))
 				continue actionLoop;
 			if (name != null && !(ignoreCase
@@ -624,10 +642,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFormalGates() {
+	public EList<Gate> getFormalGates() {
 		if (formalGates == null) {
-			formalGates = new EObjectContainmentEList.Resolving(Gate.class,
-				this, UMLPackage.INTERACTION__FORMAL_GATE);
+			formalGates = new EObjectContainmentEList.Resolving<Gate>(
+				Gate.class, this, UMLPackage.INTERACTION__FORMAL_GATE);
 		}
 		return formalGates;
 	}
@@ -661,9 +679,7 @@
 	 */
 	public Gate getFormalGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		formalGateLoop : for (Iterator i = getFormalGates().iterator(); i
-			.hasNext();) {
-			Gate formalGate = (Gate) i.next();
+		formalGateLoop : for (Gate formalGate : getFormalGates()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(formalGate.getName())
 				: name.equals(formalGate.getName())))
@@ -680,9 +696,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMessages() {
+	public EList<Message> getMessages() {
 		if (messages == null) {
-			messages = new EObjectContainmentWithInverseEList.Resolving(
+			messages = new EObjectContainmentWithInverseEList.Resolving<Message>(
 				Message.class, this, UMLPackage.INTERACTION__MESSAGE,
 				UMLPackage.MESSAGE__INTERACTION);
 		}
@@ -718,8 +734,7 @@
 	 */
 	public Message getMessage(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		messageLoop : for (Iterator i = getMessages().iterator(); i.hasNext();) {
-			Message message = (Message) i.next();
+		messageLoop : for (Message message : getMessages()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(message.getName())
 				: name.equals(message.getName())))
@@ -736,24 +751,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -768,8 +785,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -779,22 +796,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.INTERACTION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__SPECIFICATION :
 				if (specification != null)
 					msgs = ((InternalEObject) specification).eInverseRemove(
@@ -802,7 +820,8 @@
 						BehavioralFeature.class, msgs);
 				return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
 			case UMLPackage.INTERACTION__COVERED :
-				return ((InternalEList) getCovereds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -814,13 +833,14 @@
 				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION__LIFELINE :
-				return ((InternalEList) getLifelines())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getLifelines())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__FRAGMENT :
-				return ((InternalEList) getFragments())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION__MESSAGE :
-				return ((InternalEList) getMessages()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMessages())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -830,118 +850,119 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.INTERACTION__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__PRECONDITION :
-				return ((InternalEList) getPreconditions()).basicRemove(
+				return ((InternalEList<?>) getPreconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__POSTCONDITION :
-				return ((InternalEList) getPostconditions()).basicRemove(
+				return ((InternalEList<?>) getPostconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 			case UMLPackage.INTERACTION__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
 			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
 				return basicSetEnclosingOperand(null, msgs);
 			case UMLPackage.INTERACTION__LIFELINE :
-				return ((InternalEList) getLifelines()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getLifelines()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION__FRAGMENT :
-				return ((InternalEList) getFragments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getFragments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION__ACTION :
-				return ((InternalEList) getActions()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getActions()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION__FORMAL_GATE :
-				return ((InternalEList) getFormalGates()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getFormalGates()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION__MESSAGE :
-				return ((InternalEList) getMessages()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getMessages()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -952,6 +973,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -975,6 +997,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
@@ -1158,15 +1181,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERACTION__NAME :
 				setName((String) newValue);
@@ -1176,22 +1203,26 @@
 				return;
 			case UMLPackage.INTERACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INTERACTION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1207,7 +1238,8 @@
 				return;
 			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1217,118 +1249,141 @@
 				return;
 			case UMLPackage.INTERACTION__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERACTION__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERACTION__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.INTERACTION__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.INTERACTION__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INTERACTION__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.INTERACTION__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.INTERACTION__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.INTERACTION__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.INTERACTION__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.INTERACTION__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INTERACTION__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.INTERACTION__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
 				return;
 			case UMLPackage.INTERACTION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.INTERACTION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -1338,23 +1393,25 @@
 				return;
 			case UMLPackage.INTERACTION__LIFELINE :
 				getLifelines().clear();
-				getLifelines().addAll((Collection) newValue);
+				getLifelines()
+					.addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.INTERACTION__FRAGMENT :
 				getFragments().clear();
-				getFragments().addAll((Collection) newValue);
+				getFragments().addAll(
+					(Collection<? extends InteractionFragment>) newValue);
 				return;
 			case UMLPackage.INTERACTION__ACTION :
 				getActions().clear();
-				getActions().addAll((Collection) newValue);
+				getActions().addAll((Collection<? extends Action>) newValue);
 				return;
 			case UMLPackage.INTERACTION__FORMAL_GATE :
 				getFormalGates().clear();
-				getFormalGates().addAll((Collection) newValue);
+				getFormalGates().addAll((Collection<? extends Gate>) newValue);
 				return;
 			case UMLPackage.INTERACTION__MESSAGE :
 				getMessages().clear();
-				getMessages().addAll((Collection) newValue);
+				getMessages().addAll((Collection<? extends Message>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1365,6 +1422,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
@@ -1535,6 +1593,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION__EANNOTATIONS :
@@ -1693,7 +1752,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.INTERACTION__COVERED :
@@ -1716,7 +1776,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.INTERACTION_FRAGMENT__COVERED :
@@ -1774,6 +1835,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INTERACTION__GENERAL_ORDERING)
@@ -1799,6 +1861,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.INTERACTION__ENCLOSING_OPERAND);
@@ -1832,6 +1895,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.INTERACTION__LIFELINE)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionOperandImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionOperandImpl.java
index 48d797b..9b5f4bb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionOperandImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionOperandImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionOperandImpl.java,v 1.20 2006/11/14 18:02:16 khussey Exp $
+ * $Id: InteractionOperandImpl.java,v 1.21 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -39,7 +39,11 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionConstraint;
@@ -48,6 +52,7 @@
 import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -87,7 +92,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList covereds = null;
+	protected EList<Lifeline> covereds = null;
 
 	/**
 	 * The cached value of the '{@link #getGeneralOrderings() <em>General Ordering</em>}' containment reference list.
@@ -97,7 +102,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList generalOrderings = null;
+	protected EList<GeneralOrdering> generalOrderings = null;
 
 	/**
 	 * The cached value of the '{@link #getGuard() <em>Guard</em>}' containment reference.
@@ -117,7 +122,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList fragments = null;
+	protected EList<InteractionFragment> fragments = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -133,6 +138,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERACTION_OPERAND;
 	}
@@ -142,23 +148,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -168,9 +176,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCovereds() {
+	public EList<Lifeline> getCovereds() {
 		if (covereds == null) {
-			covereds = new EObjectWithInverseResolvingEList.ManyInverse(
+			covereds = new EObjectWithInverseResolvingEList.ManyInverse<Lifeline>(
 				Lifeline.class, this, UMLPackage.INTERACTION_OPERAND__COVERED,
 				UMLPackage.LIFELINE__COVERED_BY);
 		}
@@ -192,8 +200,7 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Iterator i = getCovereds().iterator(); i.hasNext();) {
-			Lifeline covered = (Lifeline) i.next();
+		coveredLoop : for (Lifeline covered : getCovereds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(covered.getName())
 				: name.equals(covered.getName())))
@@ -208,9 +215,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getGeneralOrderings() {
+	public EList<GeneralOrdering> getGeneralOrderings() {
 		if (generalOrderings == null) {
-			generalOrderings = new EObjectContainmentEList.Resolving(
+			generalOrderings = new EObjectContainmentEList.Resolving<GeneralOrdering>(
 				GeneralOrdering.class, this,
 				UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING);
 		}
@@ -246,9 +253,7 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (Iterator i = getGeneralOrderings()
-			.iterator(); i.hasNext();) {
-			GeneralOrdering generalOrdering = (GeneralOrdering) i.next();
+		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(generalOrdering.getName())
 				: name.equals(generalOrdering.getName())))
@@ -393,25 +398,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER,
+			OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -517,9 +524,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFragments() {
+	public EList<InteractionFragment> getFragments() {
 		if (fragments == null) {
-			fragments = new EObjectContainmentWithInverseEList.Resolving(
+			fragments = new EObjectContainmentWithInverseEList.Resolving<InteractionFragment>(
 				InteractionFragment.class, this,
 				UMLPackage.INTERACTION_OPERAND__FRAGMENT,
 				UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND);
@@ -556,8 +563,7 @@
 	 */
 	public InteractionFragment getFragment(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		fragmentLoop : for (Iterator i = getFragments().iterator(); i.hasNext();) {
-			InteractionFragment fragment = (InteractionFragment) i.next();
+		fragmentLoop : for (InteractionFragment fragment : getFragments()) {
 			if (eClass != null && !eClass.isInstance(fragment))
 				continue fragmentLoop;
 			if (name != null && !(ignoreCase
@@ -577,7 +583,7 @@
 	 * @generated
 	 */
 	public boolean validateGuardDirectlyPrior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionOperandOperations.validateGuardDirectlyPrior(this,
 			diagnostics, context);
 	}
@@ -588,7 +594,7 @@
 	 * @generated
 	 */
 	public boolean validateGuardContainReferences(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionOperandOperations.validateGuardContainReferences(
 			this, diagnostics, context);
 	}
@@ -598,26 +604,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return ((InternalEList) getCovereds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -629,7 +638,7 @@
 				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return ((InternalEList) getFragments())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments())
 					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
@@ -640,34 +649,35 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
@@ -676,8 +686,8 @@
 			case UMLPackage.INTERACTION_OPERAND__GUARD :
 				return basicSetGuard(null, msgs);
 			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return ((InternalEList) getFragments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getFragments()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -687,6 +697,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -706,6 +717,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
@@ -773,15 +785,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__NAME :
 				setName((String) newValue);
@@ -791,30 +807,35 @@
 				return;
 			case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -827,7 +848,8 @@
 				return;
 			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
 				getFragments().clear();
-				getFragments().addAll((Collection) newValue);
+				getFragments().addAll(
+					(Collection<? extends InteractionFragment>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -838,6 +860,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
@@ -894,6 +917,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
@@ -952,7 +976,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.INTERACTION_OPERAND__COVERED :
@@ -975,7 +1000,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.INTERACTION_FRAGMENT__COVERED :
@@ -1027,6 +1053,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING)
@@ -1052,6 +1079,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND);
@@ -1074,6 +1102,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.INTERACTION_OPERAND__FRAGMENT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionUseImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionUseImpl.java
index b31871a..3494b4e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionUseImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InteractionUseImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionUseImpl.java,v 1.21 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InteractionUseImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,11 +37,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Action;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Gate;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
 import org.eclipse.uml2.uml.InteractionUse;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -86,7 +90,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList actualGates = null;
+	protected EList<Gate> actualGates = null;
 
 	/**
 	 * The cached value of the '{@link #getArguments() <em>Argument</em>}' containment reference list.
@@ -96,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList arguments = null;
+	protected EList<Action> arguments = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,6 +116,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERACTION_USE;
 	}
@@ -121,23 +126,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.INTERACTION_USE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.INTERACTION_USE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.INTERACTION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -189,10 +196,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getActualGates() {
+	public EList<Gate> getActualGates() {
 		if (actualGates == null) {
-			actualGates = new EObjectContainmentEList.Resolving(Gate.class,
-				this, UMLPackage.INTERACTION_USE__ACTUAL_GATE);
+			actualGates = new EObjectContainmentEList.Resolving<Gate>(
+				Gate.class, this, UMLPackage.INTERACTION_USE__ACTUAL_GATE);
 		}
 		return actualGates;
 	}
@@ -226,9 +233,7 @@
 	 */
 	public Gate getActualGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		actualGateLoop : for (Iterator i = getActualGates().iterator(); i
-			.hasNext();) {
-			Gate actualGate = (Gate) i.next();
+		actualGateLoop : for (Gate actualGate : getActualGates()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(actualGate.getName())
 				: name.equals(actualGate.getName())))
@@ -245,10 +250,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getArguments() {
+	public EList<Action> getArguments() {
 		if (arguments == null) {
-			arguments = new EObjectContainmentEList.Resolving(Action.class,
-				this, UMLPackage.INTERACTION_USE__ARGUMENT);
+			arguments = new EObjectContainmentEList.Resolving<Action>(
+				Action.class, this, UMLPackage.INTERACTION_USE__ARGUMENT);
 		}
 		return arguments;
 	}
@@ -282,8 +287,7 @@
 	 */
 	public Action getArgument(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		argumentLoop : for (Iterator i = getArguments().iterator(); i.hasNext();) {
-			Action argument = (Action) i.next();
+		argumentLoop : for (Action argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
 			if (name != null && !(ignoreCase
@@ -302,7 +306,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGatesMatch(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGatesMatch(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InteractionUseOperations.validateGatesMatch(this, diagnostics,
 			context);
 	}
@@ -312,7 +317,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAllLifelines(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAllLifelines(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InteractionUseOperations.validateAllLifelines(this, diagnostics,
 			context);
 	}
@@ -323,7 +329,7 @@
 	 * @generated
 	 */
 	public boolean validateArgumentsCorrespondToParameters(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return InteractionUseOperations
 			.validateArgumentsCorrespondToParameters(this, diagnostics, context);
 	}
@@ -334,7 +340,7 @@
 	 * @generated
 	 */
 	public boolean validateArgumentsAreConstants(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InteractionUseOperations.validateArgumentsAreConstants(this,
 			diagnostics, context);
 	}
@@ -344,36 +350,37 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERACTION_USE__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
 			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
 				return basicSetEnclosingOperand(null, msgs);
 			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				return ((InternalEList) getActualGates()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getActualGates()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -383,6 +390,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
@@ -440,15 +448,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__NAME :
 				setName((String) newValue);
@@ -458,18 +470,20 @@
 				return;
 			case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -482,11 +496,11 @@
 				return;
 			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
 				getActualGates().clear();
-				getActualGates().addAll((Collection) newValue);
+				getActualGates().addAll((Collection<? extends Gate>) newValue);
 				return;
 			case UMLPackage.INTERACTION_USE__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments().addAll((Collection<? extends Action>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -497,6 +511,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
@@ -547,6 +562,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
@@ -609,6 +625,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.INTERACTION_USE__ACTUAL_GATE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceImpl.java
index 856f5ea..c9b76ca 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterfaceImpl.java,v 1.25 2006/11/14 18:02:16 khussey Exp $
+ * $Id: InterfaceImpl.java,v 1.26 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -40,20 +40,30 @@
 
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.ProtocolStateMachine;
 import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.InterfaceOperations;
@@ -92,7 +102,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedOperations() <em>Owned Operation</em>}' containment reference list.
@@ -102,7 +112,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedOperations = null;
+	protected EList<Operation> ownedOperations = null;
 
 	/**
 	 * The cached value of the '{@link #getNestedClassifiers() <em>Nested Classifier</em>}' containment reference list.
@@ -112,7 +122,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nestedClassifiers = null;
+	protected EList<Classifier> nestedClassifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getRedefinedInterfaces() <em>Redefined Interface</em>}' reference list.
@@ -122,7 +132,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedInterfaces = null;
+	protected EList<Interface> redefinedInterfaces = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedReceptions() <em>Owned Reception</em>}' containment reference list.
@@ -132,7 +142,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedReceptions = null;
+	protected EList<Reception> ownedReceptions = null;
 
 	/**
 	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' containment reference.
@@ -158,6 +168,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERFACE;
 	}
@@ -167,23 +178,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.INTERFACE__ATTRIBUTE,
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.INTERFACE__ATTRIBUTE,
 						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.INTERFACE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -192,25 +204,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.INTERFACE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.INTERFACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.INTERFACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -218,24 +231,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.INTERFACE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.INTERFACE__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.INTERFACE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -244,22 +263,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.INTERFACE__FEATURE, FEATURE_ESUBSETS));
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this, UMLPackage.INTERFACE__FEATURE,
+						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.INTERFACE__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -268,9 +289,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this, UMLPackage.INTERFACE__OWNED_ATTRIBUTE);
 		}
 		return ownedAttributes;
@@ -316,9 +337,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -339,9 +358,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNestedClassifiers() {
+	public EList<Classifier> getNestedClassifiers() {
 		if (nestedClassifiers == null) {
-			nestedClassifiers = new EObjectContainmentEList.Resolving(
+			nestedClassifiers = new EObjectContainmentEList.Resolving<Classifier>(
 				Classifier.class, this, UMLPackage.INTERFACE__NESTED_CLASSIFIER);
 		}
 		return nestedClassifiers;
@@ -376,9 +395,7 @@
 	 */
 	public Classifier getNestedClassifier(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedClassifierLoop : for (Iterator i = getNestedClassifiers()
-			.iterator(); i.hasNext();) {
-			Classifier nestedClassifier = (Classifier) i.next();
+		nestedClassifierLoop : for (Classifier nestedClassifier : getNestedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(nestedClassifier))
 				continue nestedClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -397,10 +414,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedInterfaces() {
+	public EList<Interface> getRedefinedInterfaces() {
 		if (redefinedInterfaces == null) {
-			redefinedInterfaces = new EObjectResolvingEList(Interface.class,
-				this, UMLPackage.INTERFACE__REDEFINED_INTERFACE);
+			redefinedInterfaces = new EObjectResolvingEList<Interface>(
+				Interface.class, this,
+				UMLPackage.INTERFACE__REDEFINED_INTERFACE);
 		}
 		return redefinedInterfaces;
 	}
@@ -420,9 +438,7 @@
 	 * @generated
 	 */
 	public Interface getRedefinedInterface(String name, boolean ignoreCase) {
-		redefinedInterfaceLoop : for (Iterator i = getRedefinedInterfaces()
-			.iterator(); i.hasNext();) {
-			Interface redefinedInterface = (Interface) i.next();
+		redefinedInterfaceLoop : for (Interface redefinedInterface : getRedefinedInterfaces()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(redefinedInterface.getName())
 				: name.equals(redefinedInterface.getName())))
@@ -437,9 +453,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedReceptions() {
+	public EList<Reception> getOwnedReceptions() {
 		if (ownedReceptions == null) {
-			ownedReceptions = new EObjectContainmentEList.Resolving(
+			ownedReceptions = new EObjectContainmentEList.Resolving<Reception>(
 				Reception.class, this, UMLPackage.INTERFACE__OWNED_RECEPTION);
 		}
 		return ownedReceptions;
@@ -451,7 +467,7 @@
 	 * @generated
 	 */
 	public Reception createOwnedReception(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Reception newOwnedReception = (Reception) create(UMLPackage.Literals.RECEPTION);
 		getOwnedReceptions().add(newOwnedReception);
 		if (name != null)
@@ -482,8 +498,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Reception getOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedReception(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -493,28 +509,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Reception getOwnedReception(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedReceptionLoop : for (Iterator i = getOwnedReceptions().iterator(); i
-			.hasNext();) {
-			Reception ownedReception = (Reception) i.next();
+	public Reception getOwnedReception(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedReceptionLoop : for (Reception ownedReception : getOwnedReceptions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedReception.getName())
 				: name.equals(ownedReception.getName())))
 				continue ownedReceptionLoop;
-			EList ownedParameterList = ownedReception.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedReception
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedReceptionLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -635,9 +649,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedOperations() {
+	public EList<Operation> getOwnedOperations() {
 		if (ownedOperations == null) {
-			ownedOperations = new EObjectContainmentWithInverseEList.Resolving(
+			ownedOperations = new EObjectContainmentWithInverseEList.Resolving<Operation>(
 				Operation.class, this, UMLPackage.INTERFACE__OWNED_OPERATION,
 				UMLPackage.OPERATION__INTERFACE);
 		}
@@ -650,7 +664,7 @@
 	 * @generated
 	 */
 	public Operation createOwnedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
@@ -681,8 +695,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getOwnedOperation(name, ownedParameterNames,
 			ownedParameterTypes, false, false);
 	}
@@ -692,28 +706,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getOwnedOperation(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase,
-			boolean createOnDemand) {
-		ownedOperationLoop : for (Iterator i = getOwnedOperations().iterator(); i
-			.hasNext();) {
-			Operation ownedOperation = (Operation) i.next();
+	public Operation getOwnedOperation(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase, boolean createOnDemand) {
+		ownedOperationLoop : for (Operation ownedOperation : getOwnedOperations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedOperation.getName())
 				: name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList ownedParameterList = ownedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -736,7 +748,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateVisibility(DiagnosticChain diagnostics, Map context) {
+	public boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return InterfaceOperations.validateVisibility(this, diagnostics,
 			context);
 	}
@@ -746,8 +759,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation createOwnedOperation(String name, EList parameterNames,
-			EList parameterTypes, Type returnType) {
+	public Operation createOwnedOperation(String name,
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			Type returnType) {
 		return InterfaceOperations.createOwnedOperation(this, name,
 			parameterNames, parameterTypes, returnType);
 	}
@@ -768,24 +782,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -800,8 +816,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -811,19 +827,20 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.INTERFACE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -833,67 +850,68 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERFACE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.INTERFACE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE__PROTOCOL :
 				return basicSetProtocol(null, msgs);
@@ -906,6 +924,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
@@ -1025,15 +1044,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERFACE__NAME :
 				setName((String) newValue);
@@ -1043,22 +1066,26 @@
 				return;
 			case UMLPackage.INTERFACE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERFACE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INTERFACE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1074,7 +1101,8 @@
 				return;
 			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1084,58 +1112,70 @@
 				return;
 			case UMLPackage.INTERFACE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERFACE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERFACE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.INTERFACE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.INTERFACE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INTERFACE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.INTERFACE__REDEFINED_INTERFACE :
 				getRedefinedInterfaces().clear();
-				getRedefinedInterfaces().addAll((Collection) newValue);
+				getRedefinedInterfaces().addAll(
+					(Collection<? extends Interface>) newValue);
 				return;
 			case UMLPackage.INTERFACE__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.INTERFACE__PROTOCOL :
 				setProtocol((ProtocolStateMachine) newValue);
@@ -1149,6 +1189,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
@@ -1253,6 +1294,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE__EANNOTATIONS :
@@ -1367,6 +1409,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE);
@@ -1392,6 +1435,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE)
@@ -1418,6 +1462,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.INTERFACE__REDEFINED_INTERFACE);
@@ -1428,6 +1473,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.INTERFACE__OWNED_OPERATION)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceRealizationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceRealizationImpl.java
index 77e5f14..daf580d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceRealizationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterfaceRealizationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterfaceRealizationImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InterfaceRealizationImpl.java,v 1.15 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,6 +33,8 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.BehavioredClassifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
@@ -85,6 +88,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERFACE_REALIZATION;
 	}
@@ -94,9 +98,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new SubsetSupersetEObjectResolvingEList(
+			suppliers = new SubsetSupersetEObjectResolvingEList<NamedElement>(
 				NamedElement.class, this,
 				UMLPackage.INTERFACE_REALIZATION__SUPPLIER, null,
 				SUPPLIER_ESUBSETS);
@@ -119,9 +123,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClients() {
+	public EList<NamedElement> getClients() {
 		if (clients == null) {
-			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<NamedElement>(
 				NamedElement.class, this,
 				UMLPackage.INTERFACE_REALIZATION__CLIENT, null,
 				CLIENT_ESUBSETS, UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY);
@@ -184,7 +188,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newContract != null) {
-				EList suppliers = getSuppliers();
+				EList<NamedElement> suppliers = getSuppliers();
 				if (!suppliers.contains(newContract)) {
 					suppliers.add(newContract);
 				}
@@ -228,7 +232,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newImplementingClassifier != null) {
-				EList clients = getClients();
+				EList<NamedElement> clients = getClients();
 				if (!clients.contains(newImplementingClassifier)) {
 					clients.add(newImplementingClassifier);
 				}
@@ -275,15 +279,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -298,7 +304,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				return ((InternalEList) getClients()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClients())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -313,18 +320,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
@@ -332,7 +340,7 @@
 			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
 				return basicSetMapping(null, msgs);
@@ -347,6 +355,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -367,6 +376,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
@@ -434,15 +444,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__NAME :
 				setName((String) newValue);
@@ -452,7 +466,8 @@
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -465,11 +480,13 @@
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
 				setMapping((OpaqueExpression) newValue);
@@ -489,6 +506,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
@@ -539,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterruptibleActivityRegionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterruptibleActivityRegionImpl.java
index 491a923..cd3f32c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterruptibleActivityRegionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InterruptibleActivityRegionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterruptibleActivityRegionImpl.java,v 1.16 2006/11/14 18:02:17 khussey Exp $
+ * $Id: InterruptibleActivityRegionImpl.java,v 1.17 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,6 +36,7 @@
 import org.eclipse.uml2.uml.Activity;
 import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.UMLPackage;
 
@@ -68,7 +69,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nodes = null;
+	protected EList<ActivityNode> nodes = null;
 
 	/**
 	 * The cached value of the '{@link #getInterruptingEdges() <em>Interrupting Edge</em>}' reference list.
@@ -78,7 +79,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList interruptingEdges = null;
+	protected EList<ActivityEdge> interruptingEdges = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -94,6 +95,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION;
 	}
@@ -103,20 +105,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedNodes() {
+	public EList<ActivityNode> getContainedNodes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedNodes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
 			if (containedNodes == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
-						containedNodes = new DerivedUnionEObjectEList(
+						containedNodes = new DerivedUnionEObjectEList<ActivityNode>(
 							ActivityNode.class,
 							this,
 							UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE,
@@ -124,8 +128,8 @@
 			}
 			return containedNodes;
 		}
-		return new DerivedUnionEObjectEList(ActivityNode.class, this,
-			UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE,
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class,
+			this, UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE,
 			CONTAINED_NODE_ESUBSETS);
 	}
 
@@ -134,9 +138,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNodes() {
+	public EList<ActivityNode> getNodes() {
 		if (nodes == null) {
-			nodes = new EObjectWithInverseResolvingEList.ManyInverse(
+			nodes = new EObjectWithInverseResolvingEList.ManyInverse<ActivityNode>(
 				ActivityNode.class, this,
 				UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE,
 				UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION);
@@ -159,8 +163,7 @@
 	 * @generated
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase, EClass eClass) {
-		nodeLoop : for (Iterator i = getNodes().iterator(); i.hasNext();) {
-			ActivityNode node = (ActivityNode) i.next();
+		nodeLoop : for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
 			if (name != null && !(ignoreCase
@@ -177,9 +180,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInterruptingEdges() {
+	public EList<ActivityEdge> getInterruptingEdges() {
 		if (interruptingEdges == null) {
-			interruptingEdges = new EObjectWithInverseResolvingEList(
+			interruptingEdges = new EObjectWithInverseResolvingEList<ActivityEdge>(
 				ActivityEdge.class, this,
 				UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE,
 				UMLPackage.ACTIVITY_EDGE__INTERRUPTS);
@@ -203,9 +206,7 @@
 	 */
 	public ActivityEdge getInterruptingEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		interruptingEdgeLoop : for (Iterator i = getInterruptingEdges()
-			.iterator(); i.hasNext();) {
-			ActivityEdge interruptingEdge = (ActivityEdge) i.next();
+		interruptingEdgeLoop : for (ActivityEdge interruptingEdge : getInterruptingEdges()) {
 			if (eClass != null && !eClass.isInstance(interruptingEdge))
 				continue interruptingEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -223,7 +224,7 @@
 	 * @generated
 	 */
 	public boolean validateInterruptingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InterruptibleActivityRegionOperations.validateInterruptingEdges(
 			this, diagnostics, context);
 	}
@@ -233,21 +234,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetInActivity((Activity) otherEnd, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return ((InternalEList) getInterruptingEdges()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterruptingEdges())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -257,21 +261,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return ((InternalEList) getInterruptingEdges()).basicRemove(
+				return ((InternalEList<?>) getInterruptingEdges()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -282,6 +288,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
@@ -321,26 +328,32 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
 				getInterruptingEdges().clear();
-				getInterruptingEdges().addAll((Collection) newValue);
+				getInterruptingEdges().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -351,6 +364,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
@@ -377,6 +391,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
@@ -421,6 +436,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetContainedNodes() {
 		return super.isSetContainedNodes()
 			|| eIsSet(UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalConstraintImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalConstraintImpl.java
index 35caaf4..1b1e48d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalConstraintImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalConstraintImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: IntervalConstraintImpl.java,v 1.17 2006/11/14 18:02:18 khussey Exp $
+ * $Id: IntervalConstraintImpl.java,v 1.18 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -57,6 +57,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERVAL_CONSTRAINT;
 	}
@@ -125,6 +126,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
 
@@ -169,6 +171,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
 		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
@@ -194,6 +197,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
@@ -249,6 +253,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalImpl.java
index 747b4f8..3c9fc34 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/IntervalImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: IntervalImpl.java,v 1.11 2006/11/14 18:02:16 khussey Exp $
+ * $Id: IntervalImpl.java,v 1.12 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Interval;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -80,6 +83,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INTERVAL;
 	}
@@ -173,6 +177,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL__EANNOTATIONS :
@@ -230,15 +235,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INTERVAL__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INTERVAL__NAME :
 				setName((String) newValue);
@@ -248,7 +257,8 @@
 				return;
 			case UMLPackage.INTERVAL__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INTERVAL__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -277,6 +287,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL__EANNOTATIONS :
@@ -321,6 +332,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INTERVAL__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InvocationActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InvocationActionImpl.java
index 4dcb8d9..ed73472 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InvocationActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/InvocationActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InvocationActionImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: InvocationActionImpl.java,v 1.24 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.InvocationAction;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.StringExpression;
@@ -75,7 +83,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList arguments = null;
+	protected EList<InputPin> arguments = null;
 
 	/**
 	 * The cached value of the '{@link #getOnPort() <em>On Port</em>}' reference.
@@ -101,6 +109,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.INVOCATION_ACTION;
 	}
@@ -110,21 +119,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -133,10 +144,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getArguments() {
+	public EList<InputPin> getArguments() {
 		if (arguments == null) {
-			arguments = new EObjectContainmentEList.Resolving(InputPin.class,
-				this, UMLPackage.INVOCATION_ACTION__ARGUMENT);
+			arguments = new EObjectContainmentEList.Resolving<InputPin>(
+				InputPin.class, this, UMLPackage.INVOCATION_ACTION__ARGUMENT);
 		}
 		return arguments;
 	}
@@ -181,8 +192,7 @@
 	 */
 	public InputPin getArgument(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		argumentLoop : for (Iterator i = getArguments().iterator(); i.hasNext();) {
-			InputPin argument = (InputPin) i.next();
+		argumentLoop : for (InputPin argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
 			if (name != null && !(ignoreCase
@@ -247,7 +257,7 @@
 	 * @generated
 	 */
 	public boolean validateOnPortReceiver(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return InvocationActionOperations.validateOnPortReceiver(this,
 			diagnostics, context);
 	}
@@ -257,18 +267,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
@@ -276,29 +287,29 @@
 			case UMLPackage.INVOCATION_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -308,6 +319,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
@@ -393,15 +405,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__NAME :
 				setName((String) newValue);
@@ -411,7 +427,8 @@
 				return;
 			case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -427,39 +444,49 @@
 				return;
 			case UMLPackage.INVOCATION_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.INVOCATION_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -473,6 +500,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
@@ -541,6 +569,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
@@ -626,6 +655,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.INVOCATION_ACTION__ARGUMENT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/JoinNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/JoinNodeImpl.java
index 54938a8..f3ed244 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/JoinNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/JoinNodeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: JoinNodeImpl.java,v 1.22 2006/11/14 18:02:19 khussey Exp $
+ * $Id: JoinNodeImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,13 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.JoinNode;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -110,6 +117,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.JOIN_NODE;
 	}
@@ -119,23 +127,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.JOIN_NODE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.JOIN_NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.JOIN_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -274,7 +284,7 @@
 	 * @generated
 	 */
 	public boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return JoinNodeOperations.validateOneOutgoingEdge(this, diagnostics,
 			context);
 	}
@@ -285,7 +295,7 @@
 	 * @generated
 	 */
 	public boolean validateIncomingObjectFlow(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return JoinNodeOperations.validateIncomingObjectFlow(this, diagnostics,
 			context);
 	}
@@ -295,18 +305,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
@@ -314,16 +325,16 @@
 			case UMLPackage.JOIN_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.JOIN_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.JOIN_NODE__JOIN_SPEC :
 				return basicSetJoinSpec(null, msgs);
@@ -336,6 +347,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.JOIN_NODE__EANNOTATIONS :
@@ -409,15 +421,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.JOIN_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__NAME :
 				setName((String) newValue);
@@ -427,7 +443,8 @@
 				return;
 			case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -443,23 +460,29 @@
 				return;
 			case UMLPackage.JOIN_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE :
 				setIsCombineDuplicate(((Boolean) newValue).booleanValue());
@@ -476,6 +499,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.JOIN_NODE__EANNOTATIONS :
@@ -535,6 +559,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.JOIN_NODE__EANNOTATIONS :
@@ -596,6 +621,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -624,6 +650,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.JOIN_NODE__JOIN_SPEC);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LifelineImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LifelineImpl.java
index fba605f..ce8893c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LifelineImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LifelineImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LifelineImpl.java,v 1.19 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LifelineImpl.java,v 1.20 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionFragment;
@@ -113,7 +115,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList coveredBys = null;
+	protected EList<InteractionFragment> coveredBys = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -129,6 +131,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LIFELINE;
 	}
@@ -150,23 +153,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.LIFELINE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.LIFELINE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.LIFELINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -426,9 +431,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCoveredBys() {
+	public EList<InteractionFragment> getCoveredBys() {
 		if (coveredBys == null) {
-			coveredBys = new EObjectWithInverseResolvingEList.ManyInverse(
+			coveredBys = new EObjectWithInverseResolvingEList.ManyInverse<InteractionFragment>(
 				InteractionFragment.class, this,
 				UMLPackage.LIFELINE__COVERED_BY,
 				UMLPackage.INTERACTION_FRAGMENT__COVERED);
@@ -452,9 +457,7 @@
 	 */
 	public InteractionFragment getCoveredBy(String name, boolean ignoreCase,
 			EClass eClass) {
-		coveredByLoop : for (Iterator i = getCoveredBys().iterator(); i
-			.hasNext();) {
-			InteractionFragment coveredBy = (InteractionFragment) i.next();
+		coveredByLoop : for (InteractionFragment coveredBy : getCoveredBys()) {
 			if (eClass != null && !eClass.isInstance(coveredBy))
 				continue coveredByLoop;
 			if (name != null && !(ignoreCase
@@ -472,7 +475,7 @@
 	 * @generated
 	 */
 	public boolean validateInteractionUsesShareLifeline(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return LifelineOperations.validateInteractionUsesShareLifeline(this,
 			diagnostics, context);
 	}
@@ -483,7 +486,7 @@
 	 * @generated
 	 */
 	public boolean validateSelectorSpecified(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LifelineOperations.validateSelectorSpecified(this, diagnostics,
 			context);
 	}
@@ -494,7 +497,7 @@
 	 * @generated
 	 */
 	public boolean validateSameClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LifelineOperations.validateSameClassifier(this, diagnostics,
 			context);
 	}
@@ -504,22 +507,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.LIFELINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.LIFELINE__INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetInteraction((Interaction) otherEnd, msgs);
 			case UMLPackage.LIFELINE__COVERED_BY :
-				return ((InternalEList) getCoveredBys()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCoveredBys())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -529,18 +534,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LIFELINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LIFELINE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.LIFELINE__INTERACTION :
@@ -548,8 +554,8 @@
 			case UMLPackage.LIFELINE__SELECTOR :
 				return basicSetSelector(null, msgs);
 			case UMLPackage.LIFELINE__COVERED_BY :
-				return ((InternalEList) getCoveredBys()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getCoveredBys()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -559,6 +565,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -574,6 +581,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
@@ -629,15 +637,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LIFELINE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LIFELINE__NAME :
 				setName((String) newValue);
@@ -647,7 +659,8 @@
 				return;
 			case UMLPackage.LIFELINE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LIFELINE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -666,7 +679,8 @@
 				return;
 			case UMLPackage.LIFELINE__COVERED_BY :
 				getCoveredBys().clear();
-				getCoveredBys().addAll((Collection) newValue);
+				getCoveredBys().addAll(
+					(Collection<? extends InteractionFragment>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -677,6 +691,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
@@ -721,6 +736,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LIFELINE__EANNOTATIONS :
@@ -779,6 +795,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.LIFELINE__INTERACTION);
@@ -801,6 +818,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.LIFELINE__SELECTOR);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkActionImpl.java
index 050c86f..17a4c3f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkActionImpl.java,v 1.22 2006/11/14 18:02:16 khussey Exp $
+ * $Id: LinkActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,8 +34,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.LinkAction;
 import org.eclipse.uml2.uml.LinkEndData;
 import org.eclipse.uml2.uml.StringExpression;
@@ -73,7 +81,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList endData = null;
+	protected EList<LinkEndData> endData = null;
 
 	/**
 	 * The cached value of the '{@link #getInputValues() <em>Input Value</em>}' containment reference list.
@@ -83,7 +91,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inputValues = null;
+	protected EList<InputPin> inputValues = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -99,6 +107,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LINK_ACTION;
 	}
@@ -108,21 +117,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.LINK_ACTION__INPUT, INPUT_ESUBSETS));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.LINK_ACTION__INPUT,
+						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.LINK_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -131,10 +142,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEndData() {
+	public EList<LinkEndData> getEndData() {
 		if (endData == null) {
-			endData = new EObjectContainmentEList.Resolving(LinkEndData.class,
-				this, UMLPackage.LINK_ACTION__END_DATA);
+			endData = new EObjectContainmentEList.Resolving<LinkEndData>(
+				LinkEndData.class, this, UMLPackage.LINK_ACTION__END_DATA);
 		}
 		return endData;
 	}
@@ -164,10 +175,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputValues() {
+	public EList<InputPin> getInputValues() {
 		if (inputValues == null) {
-			inputValues = new EObjectContainmentEList.Resolving(InputPin.class,
-				this, UMLPackage.LINK_ACTION__INPUT_VALUE);
+			inputValues = new EObjectContainmentEList.Resolving<InputPin>(
+				InputPin.class, this, UMLPackage.LINK_ACTION__INPUT_VALUE);
 		}
 		return inputValues;
 	}
@@ -212,9 +223,7 @@
 	 */
 	public InputPin getInputValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		inputValueLoop : for (Iterator i = getInputValues().iterator(); i
-			.hasNext();) {
-			InputPin inputValue = (InputPin) i.next();
+		inputValueLoop : for (InputPin inputValue : getInputValues()) {
 			if (eClass != null && !eClass.isInstance(inputValue))
 				continue inputValueLoop;
 			if (name != null && !(ignoreCase
@@ -236,7 +245,7 @@
 	 * @generated
 	 */
 	public boolean validateSameAssociation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LinkActionOperations.validateSameAssociation(this, diagnostics,
 			context);
 	}
@@ -246,7 +255,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotStatic(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LinkActionOperations.validateNotStatic(this, diagnostics,
 			context);
 	}
@@ -256,7 +266,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSamePins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSamePins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LinkActionOperations
 			.validateSamePins(this, diagnostics, context);
 	}
@@ -275,18 +286,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
@@ -294,32 +306,32 @@
 			case UMLPackage.LINK_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.LINK_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LINK_ACTION__END_DATA :
-				return ((InternalEList) getEndData()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList) getInputValues()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getInputValues()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -329,6 +341,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LINK_ACTION__EANNOTATIONS :
@@ -412,15 +425,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LINK_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__NAME :
 				setName((String) newValue);
@@ -430,7 +447,8 @@
 				return;
 			case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -446,43 +464,54 @@
 				return;
 			case UMLPackage.LINK_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__END_DATA :
 				getEndData().clear();
-				getEndData().addAll((Collection) newValue);
+				getEndData().addAll(
+					(Collection<? extends LinkEndData>) newValue);
 				return;
 			case UMLPackage.LINK_ACTION__INPUT_VALUE :
 				getInputValues().clear();
-				getInputValues().addAll((Collection) newValue);
+				getInputValues().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -493,6 +522,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_ACTION__EANNOTATIONS :
@@ -561,6 +591,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_ACTION__EANNOTATIONS :
@@ -646,6 +677,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.LINK_ACTION__INPUT_VALUE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndCreationDataImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndCreationDataImpl.java
index 691f26c..10f9595 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndCreationDataImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndCreationDataImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndCreationDataImpl.java,v 1.9 2006/11/14 18:02:16 khussey Exp $
+ * $Id: LinkEndCreationDataImpl.java,v 1.10 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,17 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
 import org.eclipse.uml2.uml.LinkEndCreationData;
 import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.QualifierValue;
 import org.eclipse.uml2.uml.UMLPackage;
 
 import org.eclipse.uml2.uml.internal.operations.LinkEndCreationDataOperations;
@@ -93,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LINK_END_CREATION_DATA;
 	}
@@ -175,7 +179,7 @@
 	 * @generated
 	 */
 	public boolean validateCreateLinkAction(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LinkEndCreationDataOperations.validateCreateLinkAction(this,
 			diagnostics, context);
 	}
@@ -186,7 +190,7 @@
 	 * @generated
 	 */
 	public boolean validateSingleInputPin(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LinkEndCreationDataOperations.validateSingleInputPin(this,
 			diagnostics, context);
 	}
@@ -196,6 +200,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
@@ -235,15 +240,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LINK_END_CREATION_DATA__VALUE :
 				setValue((InputPin) newValue);
@@ -253,7 +262,8 @@
 				return;
 			case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER :
 				getQualifiers().clear();
-				getQualifiers().addAll((Collection) newValue);
+				getQualifiers().addAll(
+					(Collection<? extends QualifierValue>) newValue);
 				return;
 			case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL :
 				setIsReplaceAll(((Boolean) newValue).booleanValue());
@@ -270,6 +280,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
@@ -302,6 +313,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
@@ -331,6 +343,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDataImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDataImpl.java
index bb85a7e..52b8f12 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDataImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDataImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndDataImpl.java,v 1.12 2006/11/14 18:02:20 khussey Exp $
+ * $Id: LinkEndDataImpl.java,v 1.13 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -30,6 +31,7 @@
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
 import org.eclipse.uml2.uml.LinkEndData;
 import org.eclipse.uml2.uml.Property;
@@ -85,7 +87,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList qualifiers = null;
+	protected EList<QualifierValue> qualifiers = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -101,6 +103,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LINK_END_DATA;
 	}
@@ -194,9 +197,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getQualifiers() {
+	public EList<QualifierValue> getQualifiers() {
 		if (qualifiers == null) {
-			qualifiers = new EObjectContainmentEList.Resolving(
+			qualifiers = new EObjectContainmentEList.Resolving<QualifierValue>(
 				QualifierValue.class, this, UMLPackage.LINK_END_DATA__QUALIFIER);
 		}
 		return qualifiers;
@@ -219,7 +222,7 @@
 	 * @generated
 	 */
 	public boolean validatePropertyIsAssociationEnd(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return LinkEndDataOperations.validatePropertyIsAssociationEnd(this,
 			diagnostics, context);
 	}
@@ -229,7 +232,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LinkEndDataOperations.validateSameType(this, diagnostics,
 			context);
 	}
@@ -239,7 +243,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LinkEndDataOperations.validateMultiplicity(this, diagnostics,
 			context);
 	}
@@ -249,7 +254,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateQualifiers(DiagnosticChain diagnostics, Map context) {
+	public boolean validateQualifiers(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LinkEndDataOperations.validateQualifiers(this, diagnostics,
 			context);
 	}
@@ -260,7 +266,7 @@
 	 * @generated
 	 */
 	public boolean validateEndObjectInputPin(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LinkEndDataOperations.validateEndObjectInputPin(this,
 			diagnostics, context);
 	}
@@ -270,18 +276,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				return ((InternalEList) getQualifiers()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getQualifiers()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -291,6 +298,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
@@ -322,15 +330,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LINK_END_DATA__VALUE :
 				setValue((InputPin) newValue);
@@ -340,7 +352,8 @@
 				return;
 			case UMLPackage.LINK_END_DATA__QUALIFIER :
 				getQualifiers().clear();
-				getQualifiers().addAll((Collection) newValue);
+				getQualifiers().addAll(
+					(Collection<? extends QualifierValue>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -351,6 +364,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
@@ -377,6 +391,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDestructionDataImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDestructionDataImpl.java
index cd3e1a7..6a30b94 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDestructionDataImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LinkEndDestructionDataImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndDestructionDataImpl.java,v 1.9 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LinkEndDestructionDataImpl.java,v 1.10 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,17 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
 import org.eclipse.uml2.uml.LinkEndDestructionData;
 import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.QualifierValue;
 import org.eclipse.uml2.uml.UMLPackage;
 
 import org.eclipse.uml2.uml.internal.operations.LinkEndDestructionDataOperations;
@@ -93,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LINK_END_DESTRUCTION_DATA;
 	}
@@ -175,7 +179,7 @@
 	 * @generated
 	 */
 	public boolean validateDestroyLinkAction(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LinkEndDestructionDataOperations.validateDestroyLinkAction(this,
 			diagnostics, context);
 	}
@@ -186,7 +190,7 @@
 	 * @generated
 	 */
 	public boolean validateUnlimitedNaturalAndMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return LinkEndDestructionDataOperations
 			.validateUnlimitedNaturalAndMultiplicity(this, diagnostics, context);
 	}
@@ -196,6 +200,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
@@ -235,15 +240,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE :
 				setValue((InputPin) newValue);
@@ -253,7 +262,8 @@
 				return;
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER :
 				getQualifiers().clear();
-				getQualifiers().addAll((Collection) newValue);
+				getQualifiers().addAll(
+					(Collection<? extends QualifierValue>) newValue);
 				return;
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES :
 				setIsDestroyDuplicates(((Boolean) newValue).booleanValue());
@@ -270,6 +280,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
@@ -302,6 +313,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
@@ -331,6 +343,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralBooleanImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralBooleanImpl.java
index 5080cba..bf57fd6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralBooleanImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralBooleanImpl.java
@@ -8,16 +8,19 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralBooleanImpl.java,v 1.13 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LiteralBooleanImpl.java,v 1.14 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.LiteralBoolean;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -78,6 +81,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_BOOLEAN;
 	}
@@ -141,6 +145,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
@@ -194,15 +199,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LITERAL_BOOLEAN__NAME :
 				setName((String) newValue);
@@ -212,7 +221,8 @@
 				return;
 			case UMLPackage.LITERAL_BOOLEAN__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -238,6 +248,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
@@ -279,6 +290,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
@@ -321,6 +333,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralIntegerImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralIntegerImpl.java
index a888541..345d9c0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralIntegerImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralIntegerImpl.java
@@ -8,16 +8,19 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralIntegerImpl.java,v 1.13 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LiteralIntegerImpl.java,v 1.14 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.LiteralInteger;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -78,6 +81,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_INTEGER;
 	}
@@ -138,6 +142,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
@@ -189,15 +194,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LITERAL_INTEGER__NAME :
 				setName((String) newValue);
@@ -207,7 +216,8 @@
 				return;
 			case UMLPackage.LITERAL_INTEGER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -233,6 +243,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
@@ -274,6 +285,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
@@ -316,6 +328,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralNullImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralNullImpl.java
index 2939875..4a9e09b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralNullImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralNullImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralNullImpl.java,v 1.2 2005/11/23 20:01:18 khussey Exp $
+ * $Id: LiteralNullImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -46,6 +46,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_NULL;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralSpecificationImpl.java
index fa4aa7b..fa5c3a0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralSpecificationImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralSpecificationImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: LiteralSpecificationImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_SPECIFICATION;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralStringImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralStringImpl.java
index 4d39686..9cd86a5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralStringImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralStringImpl.java
@@ -8,16 +8,19 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralStringImpl.java,v 1.13 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LiteralStringImpl.java,v 1.14 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.LiteralString;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -87,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_STRING;
 	}
@@ -184,6 +188,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
@@ -235,15 +240,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LITERAL_STRING__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LITERAL_STRING__NAME :
 				setName((String) newValue);
@@ -253,7 +262,8 @@
 				return;
 			case UMLPackage.LITERAL_STRING__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LITERAL_STRING__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -279,6 +289,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
@@ -320,6 +331,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
@@ -362,6 +374,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralUnlimitedNaturalImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralUnlimitedNaturalImpl.java
index c1e60b9..ecec1cc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralUnlimitedNaturalImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LiteralUnlimitedNaturalImpl.java
@@ -8,16 +8,19 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LiteralUnlimitedNaturalImpl.java,v 1.13 2006/11/14 18:02:17 khussey Exp $
+ * $Id: LiteralUnlimitedNaturalImpl.java,v 1.14 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -78,6 +81,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LITERAL_UNLIMITED_NATURAL;
 	}
@@ -138,6 +142,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
@@ -189,15 +194,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME :
 				setName((String) newValue);
@@ -207,7 +216,8 @@
 				return;
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -233,6 +243,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
@@ -274,6 +285,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
@@ -316,6 +328,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LoopNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LoopNodeImpl.java
index 83136ad..09da2cb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LoopNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/LoopNodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LoopNodeImpl.java,v 1.24 2006/11/14 18:02:20 khussey Exp $
+ * $Id: LoopNodeImpl.java,v 1.25 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -38,14 +38,25 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.ExecutableNode;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.LoopNode;
 import org.eclipse.uml2.uml.OutputPin;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.LoopNodeOperations;
@@ -105,7 +116,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodyParts = null;
+	protected EList<ExecutableNode> bodyParts = null;
 
 	/**
 	 * The cached value of the '{@link #getSetupParts() <em>Setup Part</em>}' reference list.
@@ -115,7 +126,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList setupParts = null;
+	protected EList<ExecutableNode> setupParts = null;
 
 	/**
 	 * The cached value of the '{@link #getDecider() <em>Decider</em>}' reference.
@@ -135,7 +146,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList tests = null;
+	protected EList<ExecutableNode> tests = null;
 
 	/**
 	 * The cached value of the '{@link #getResults() <em>Result</em>}' containment reference list.
@@ -145,7 +156,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList results = null;
+	protected EList<OutputPin> results = null;
 
 	/**
 	 * The cached value of the '{@link #getLoopVariables() <em>Loop Variable</em>}' reference list.
@@ -155,7 +166,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList loopVariables = null;
+	protected EList<OutputPin> loopVariables = null;
 
 	/**
 	 * The cached value of the '{@link #getBodyOutputs() <em>Body Output</em>}' reference list.
@@ -165,7 +176,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodyOutputs = null;
+	protected EList<OutputPin> bodyOutputs = null;
 
 	/**
 	 * The cached value of the '{@link #getLoopVariableInputs() <em>Loop Variable Input</em>}' containment reference list.
@@ -175,7 +186,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList loopVariableInputs = null;
+	protected EList<InputPin> loopVariableInputs = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -191,6 +202,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.LOOP_NODE;
 	}
@@ -200,21 +212,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.LOOP_NODE__OUTPUT, OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this, UMLPackage.LOOP_NODE__OUTPUT,
+						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.LOOP_NODE__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -223,21 +237,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.LOOP_NODE__INPUT, INPUT_ESUBSETS));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.LOOP_NODE__INPUT,
+						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.LOOP_NODE__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -274,10 +290,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodyParts() {
+	public EList<ExecutableNode> getBodyParts() {
 		if (bodyParts == null) {
-			bodyParts = new EObjectResolvingEList(ExecutableNode.class, this,
-				UMLPackage.LOOP_NODE__BODY_PART);
+			bodyParts = new EObjectResolvingEList<ExecutableNode>(
+				ExecutableNode.class, this, UMLPackage.LOOP_NODE__BODY_PART);
 		}
 		return bodyParts;
 	}
@@ -298,8 +314,7 @@
 	 */
 	public ExecutableNode getBodyPart(String name, boolean ignoreCase,
 			EClass eClass) {
-		bodyPartLoop : for (Iterator i = getBodyParts().iterator(); i.hasNext();) {
-			ExecutableNode bodyPart = (ExecutableNode) i.next();
+		bodyPartLoop : for (ExecutableNode bodyPart : getBodyParts()) {
 			if (eClass != null && !eClass.isInstance(bodyPart))
 				continue bodyPartLoop;
 			if (name != null && !(ignoreCase
@@ -316,10 +331,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSetupParts() {
+	public EList<ExecutableNode> getSetupParts() {
 		if (setupParts == null) {
-			setupParts = new EObjectResolvingEList(ExecutableNode.class, this,
-				UMLPackage.LOOP_NODE__SETUP_PART);
+			setupParts = new EObjectResolvingEList<ExecutableNode>(
+				ExecutableNode.class, this, UMLPackage.LOOP_NODE__SETUP_PART);
 		}
 		return setupParts;
 	}
@@ -340,9 +355,7 @@
 	 */
 	public ExecutableNode getSetupPart(String name, boolean ignoreCase,
 			EClass eClass) {
-		setupPartLoop : for (Iterator i = getSetupParts().iterator(); i
-			.hasNext();) {
-			ExecutableNode setupPart = (ExecutableNode) i.next();
+		setupPartLoop : for (ExecutableNode setupPart : getSetupParts()) {
 			if (eClass != null && !eClass.isInstance(setupPart))
 				continue setupPartLoop;
 			if (name != null && !(ignoreCase
@@ -401,10 +414,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTests() {
+	public EList<ExecutableNode> getTests() {
 		if (tests == null) {
-			tests = new EObjectResolvingEList(ExecutableNode.class, this,
-				UMLPackage.LOOP_NODE__TEST);
+			tests = new EObjectResolvingEList<ExecutableNode>(
+				ExecutableNode.class, this, UMLPackage.LOOP_NODE__TEST);
 		}
 		return tests;
 	}
@@ -424,8 +437,7 @@
 	 * @generated
 	 */
 	public ExecutableNode getTest(String name, boolean ignoreCase, EClass eClass) {
-		testLoop : for (Iterator i = getTests().iterator(); i.hasNext();) {
-			ExecutableNode test = (ExecutableNode) i.next();
+		testLoop : for (ExecutableNode test : getTests()) {
 			if (eClass != null && !eClass.isInstance(test))
 				continue testLoop;
 			if (name != null && !(ignoreCase
@@ -442,10 +454,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getResults() {
+	public EList<OutputPin> getResults() {
 		if (results == null) {
-			results = new EObjectContainmentEList.Resolving(OutputPin.class,
-				this, UMLPackage.LOOP_NODE__RESULT);
+			results = new EObjectContainmentEList.Resolving<OutputPin>(
+				OutputPin.class, this, UMLPackage.LOOP_NODE__RESULT);
 		}
 		return results;
 	}
@@ -481,8 +493,7 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (Iterator i = getResults().iterator(); i.hasNext();) {
-			OutputPin result = (OutputPin) i.next();
+		resultLoop : for (OutputPin result : getResults()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(result.getName())
 				: name.equals(result.getName())))
@@ -501,10 +512,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLoopVariables() {
+	public EList<OutputPin> getLoopVariables() {
 		if (loopVariables == null) {
-			loopVariables = new EObjectResolvingEList(OutputPin.class, this,
-				UMLPackage.LOOP_NODE__LOOP_VARIABLE);
+			loopVariables = new EObjectResolvingEList<OutputPin>(
+				OutputPin.class, this, UMLPackage.LOOP_NODE__LOOP_VARIABLE);
 		}
 		return loopVariables;
 	}
@@ -524,9 +535,7 @@
 	 * @generated
 	 */
 	public OutputPin getLoopVariable(String name, Type type, boolean ignoreCase) {
-		loopVariableLoop : for (Iterator i = getLoopVariables().iterator(); i
-			.hasNext();) {
-			OutputPin loopVariable = (OutputPin) i.next();
+		loopVariableLoop : for (OutputPin loopVariable : getLoopVariables()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(loopVariable.getName())
 				: name.equals(loopVariable.getName())))
@@ -543,10 +552,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodyOutputs() {
+	public EList<OutputPin> getBodyOutputs() {
 		if (bodyOutputs == null) {
-			bodyOutputs = new EObjectResolvingEList(OutputPin.class, this,
-				UMLPackage.LOOP_NODE__BODY_OUTPUT);
+			bodyOutputs = new EObjectResolvingEList<OutputPin>(OutputPin.class,
+				this, UMLPackage.LOOP_NODE__BODY_OUTPUT);
 		}
 		return bodyOutputs;
 	}
@@ -566,9 +575,7 @@
 	 * @generated
 	 */
 	public OutputPin getBodyOutput(String name, Type type, boolean ignoreCase) {
-		bodyOutputLoop : for (Iterator i = getBodyOutputs().iterator(); i
-			.hasNext();) {
-			OutputPin bodyOutput = (OutputPin) i.next();
+		bodyOutputLoop : for (OutputPin bodyOutput : getBodyOutputs()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(bodyOutput.getName())
 				: name.equals(bodyOutput.getName())))
@@ -585,9 +592,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLoopVariableInputs() {
+	public EList<InputPin> getLoopVariableInputs() {
 		if (loopVariableInputs == null) {
-			loopVariableInputs = new EObjectContainmentEList.Resolving(
+			loopVariableInputs = new EObjectContainmentEList.Resolving<InputPin>(
 				InputPin.class, this, UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT);
 		}
 		return loopVariableInputs;
@@ -635,9 +642,7 @@
 	 */
 	public InputPin getLoopVariableInput(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		loopVariableInputLoop : for (Iterator i = getLoopVariableInputs()
-			.iterator(); i.hasNext();) {
-			InputPin loopVariableInput = (InputPin) i.next();
+		loopVariableInputLoop : for (InputPin loopVariableInput : getLoopVariableInputs()) {
 			if (eClass != null && !eClass.isInstance(loopVariableInput))
 				continue loopVariableInputLoop;
 			if (name != null && !(ignoreCase
@@ -658,7 +663,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInputEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInputEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return LoopNodeOperations
 			.validateInputEdges(this, diagnostics, context);
 	}
@@ -669,7 +675,7 @@
 	 * @generated
 	 */
 	public boolean validateBodyOutputPins(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LoopNodeOperations.validateBodyOutputPins(this, diagnostics,
 			context);
 	}
@@ -680,7 +686,7 @@
 	 * @generated
 	 */
 	public boolean validateResultNoIncoming(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return LoopNodeOperations.validateResultNoIncoming(this, diagnostics,
 			context);
 	}
@@ -690,18 +696,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
@@ -709,50 +716,52 @@
 			case UMLPackage.LOOP_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.LOOP_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.LOOP_NODE__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.LOOP_NODE__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.LOOP_NODE__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.LOOP_NODE__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				return ((InternalEList) getLoopVariableInputs()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLoopVariableInputs())
+					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -762,6 +771,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.LOOP_NODE__EANNOTATIONS :
@@ -899,15 +909,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.LOOP_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__NAME :
 				setName((String) newValue);
@@ -917,7 +931,8 @@
 				return;
 			case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -933,99 +948,120 @@
 				return;
 			case UMLPackage.LOOP_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__MUST_ISOLATE :
 				setMustIsolate(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.LOOP_NODE__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__IS_TESTED_FIRST :
 				setIsTestedFirst(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.LOOP_NODE__BODY_PART :
 				getBodyParts().clear();
-				getBodyParts().addAll((Collection) newValue);
+				getBodyParts().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__SETUP_PART :
 				getSetupParts().clear();
-				getSetupParts().addAll((Collection) newValue);
+				getSetupParts().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__DECIDER :
 				setDecider((OutputPin) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__TEST :
 				getTests().clear();
-				getTests().addAll((Collection) newValue);
+				getTests().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
 				getLoopVariables().clear();
-				getLoopVariables().addAll((Collection) newValue);
+				getLoopVariables().addAll(
+					(Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__BODY_OUTPUT :
 				getBodyOutputs().clear();
-				getBodyOutputs().addAll((Collection) newValue);
+				getBodyOutputs().addAll(
+					(Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
 				getLoopVariableInputs().clear();
-				getLoopVariableInputs().addAll((Collection) newValue);
+				getLoopVariableInputs().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1036,6 +1072,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LOOP_NODE__EANNOTATIONS :
@@ -1149,6 +1186,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.LOOP_NODE__EANNOTATIONS :
@@ -1269,6 +1307,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1295,6 +1334,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs() || eIsSet(UMLPackage.LOOP_NODE__RESULT);
 	}
@@ -1314,6 +1354,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ManifestationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ManifestationImpl.java
index 77dc4df..8195cf5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ManifestationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ManifestationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ManifestationImpl.java,v 1.13 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ManifestationImpl.java,v 1.14 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -17,6 +17,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -26,6 +27,8 @@
 
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Manifestation;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.OpaqueExpression;
@@ -77,6 +80,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MANIFESTATION;
 	}
@@ -86,9 +90,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new SubsetSupersetEObjectResolvingEList(
+			suppliers = new SubsetSupersetEObjectResolvingEList<NamedElement>(
 				NamedElement.class, this, UMLPackage.MANIFESTATION__SUPPLIER,
 				null, SUPPLIER_ESUBSETS);
 		}
@@ -150,7 +154,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newUtilizedElement != null) {
-				EList suppliers = getSuppliers();
+				EList<NamedElement> suppliers = getSuppliers();
 				if (!suppliers.contains(newUtilizedElement)) {
 					suppliers.add(newUtilizedElement);
 				}
@@ -163,6 +167,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MANIFESTATION__EANNOTATIONS :
@@ -226,15 +231,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MANIFESTATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MANIFESTATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MANIFESTATION__NAME :
 				setName((String) newValue);
@@ -244,7 +253,8 @@
 				return;
 			case UMLPackage.MANIFESTATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.MANIFESTATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -257,11 +267,13 @@
 				return;
 			case UMLPackage.MANIFESTATION__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.MANIFESTATION__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.MANIFESTATION__MAPPING :
 				setMapping((OpaqueExpression) newValue);
@@ -278,6 +290,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MANIFESTATION__EANNOTATIONS :
@@ -325,6 +338,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MANIFESTATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MergeNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MergeNodeImpl.java
index 5c70a88..7383653 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MergeNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MergeNodeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MergeNodeImpl.java,v 1.2 2005/11/23 20:01:19 khussey Exp $
+ * $Id: MergeNodeImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MERGE_NODE;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return MergeNodeOperations.validateOneOutgoingEdge(this, diagnostics,
 			context);
 	}
@@ -70,7 +71,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MergeNodeOperations.validateEdges(this, diagnostics, context);
 	}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEndImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEndImpl.java
index 38c566d..f537c61 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEndImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEndImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageEndImpl.java,v 1.11 2006/11/14 18:02:15 khussey Exp $
+ * $Id: MessageEndImpl.java,v 1.12 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Message;
 import org.eclipse.uml2.uml.MessageEnd;
 import org.eclipse.uml2.uml.StringExpression;
@@ -67,6 +70,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MESSAGE_END;
 	}
@@ -118,6 +122,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_END__EANNOTATIONS :
@@ -159,15 +164,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_END__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MESSAGE_END__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MESSAGE_END__NAME :
 				setName((String) newValue);
@@ -177,7 +186,8 @@
 				return;
 			case UMLPackage.MESSAGE_END__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.MESSAGE_END__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -194,6 +204,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_END__EANNOTATIONS :
@@ -226,6 +237,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_END__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEventImpl.java
index 323ec34..5d8fd1a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageEventImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageEventImpl.java,v 1.2 2005/11/23 20:01:15 khussey Exp $
+ * $Id: MessageEventImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MESSAGE_EVENT;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageImpl.java
index a227f6b..ce18285 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageImpl.java,v 1.21 2006/11/14 18:02:19 khussey Exp $
+ * $Id: MessageImpl.java,v 1.22 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.Message;
@@ -148,7 +150,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList arguments = null;
+	protected EList<ValueSpecification> arguments = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -164,6 +166,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MESSAGE;
 	}
@@ -185,23 +188,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.MESSAGE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.MESSAGE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.MESSAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -436,9 +440,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getArguments() {
+	public EList<ValueSpecification> getArguments() {
 		if (arguments == null) {
-			arguments = new EObjectContainmentEList.Resolving(
+			arguments = new EObjectContainmentEList.Resolving<ValueSpecification>(
 				ValueSpecification.class, this, UMLPackage.MESSAGE__ARGUMENT);
 		}
 		return arguments;
@@ -476,8 +480,7 @@
 	 */
 	public ValueSpecification getArgument(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		argumentLoop : for (Iterator i = getArguments().iterator(); i.hasNext();) {
-			ValueSpecification argument = (ValueSpecification) i.next();
+		argumentLoop : for (ValueSpecification argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
 			if (name != null && !(ignoreCase
@@ -521,7 +524,7 @@
 	 * @generated
 	 */
 	public boolean validateSendingReceivingMessageEvent(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MessageOperations.validateSendingReceivingMessageEvent(this,
 			diagnostics, context);
 	}
@@ -532,7 +535,7 @@
 	 * @generated
 	 */
 	public boolean validateSignatureReferTo(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return MessageOperations.validateSignatureReferTo(this, diagnostics,
 			context);
 	}
@@ -543,7 +546,7 @@
 	 * @generated
 	 */
 	public boolean validateSignatureIsOperation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return MessageOperations.validateSignatureIsOperation(this,
 			diagnostics, context);
 	}
@@ -554,7 +557,7 @@
 	 * @generated
 	 */
 	public boolean validateSignatureIsSignal(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return MessageOperations.validateSignatureIsSignal(this, diagnostics,
 			context);
 	}
@@ -564,7 +567,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateArguments(DiagnosticChain diagnostics, Map context) {
+	public boolean validateArguments(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MessageOperations.validateArguments(this, diagnostics, context);
 	}
 
@@ -574,7 +578,7 @@
 	 * @generated
 	 */
 	public boolean validateCannotCrossBoundaries(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return MessageOperations.validateCannotCrossBoundaries(this,
 			diagnostics, context);
 	}
@@ -585,7 +589,7 @@
 	 * @generated
 	 */
 	public boolean validateOccurrenceSpecifications(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MessageOperations.validateOccurrenceSpecifications(this,
 			diagnostics, context);
 	}
@@ -595,15 +599,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.MESSAGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.MESSAGE__INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -617,25 +623,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.MESSAGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.MESSAGE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.MESSAGE__INTERACTION :
 				return basicSetInteraction(null, msgs);
 			case UMLPackage.MESSAGE__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -645,6 +652,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -660,6 +668,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
@@ -723,15 +732,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MESSAGE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MESSAGE__NAME :
 				setName((String) newValue);
@@ -741,7 +754,8 @@
 				return;
 			case UMLPackage.MESSAGE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.MESSAGE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -763,7 +777,8 @@
 				return;
 			case UMLPackage.MESSAGE__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments().addAll(
+					(Collection<? extends ValueSpecification>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -774,6 +789,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
@@ -821,6 +837,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE__EANNOTATIONS :
@@ -871,6 +888,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -901,6 +919,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.MESSAGE__INTERACTION);
@@ -923,6 +942,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.MESSAGE__ARGUMENT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageOccurrenceSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageOccurrenceSpecificationImpl.java
index 97faf18..136496a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageOccurrenceSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MessageOccurrenceSpecificationImpl.java
@@ -8,21 +8,26 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageOccurrenceSpecificationImpl.java,v 1.13 2006/11/14 18:02:16 khussey Exp $
+ * $Id: MessageOccurrenceSpecificationImpl.java,v 1.14 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Event;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.Message;
 import org.eclipse.uml2.uml.MessageEnd;
 import org.eclipse.uml2.uml.MessageOccurrenceSpecification;
@@ -71,6 +76,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION;
 	}
@@ -124,6 +130,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -185,15 +192,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -203,18 +214,20 @@
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -224,14 +237,16 @@
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE :
 				getToBefores().clear();
-				getToBefores().addAll((Collection) newValue);
+				getToBefores().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EVENT :
 				setEvent((Event) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER :
 				getToAfters().clear();
-				getToAfters().addAll((Collection) newValue);
+				getToAfters().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
 				setMessage((Message) newValue);
@@ -245,6 +260,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -298,6 +314,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -348,7 +365,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == MessageEnd.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
@@ -365,7 +383,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == MessageEnd.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.MESSAGE_END__MESSAGE :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ModelImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ModelImpl.java
index 5ed6f29..8081ad5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ModelImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ModelImpl.java
@@ -8,20 +8,31 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ModelImpl.java,v 1.12 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ModelImpl.java,v 1.13 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Model;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.PackageMerge;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.ProfileApplication;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -87,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MODEL;
 	}
@@ -157,6 +169,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MODEL__EANNOTATIONS :
@@ -236,15 +249,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MODEL__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MODEL__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MODEL__NAME :
 				setName((String) newValue);
@@ -254,22 +271,26 @@
 				return;
 			case UMLPackage.MODEL__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.MODEL__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.MODEL__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.MODEL__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.MODEL__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -279,33 +300,39 @@
 				return;
 			case UMLPackage.MODEL__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
 				return;
 			case UMLPackage.MODEL__OWNED_TYPE :
 				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection) newValue);
+				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.MODEL__PACKAGE_MERGE :
 				getPackageMerges().clear();
-				getPackageMerges().addAll((Collection) newValue);
+				getPackageMerges().addAll(
+					(Collection<? extends PackageMerge>) newValue);
 				return;
 			case UMLPackage.MODEL__PACKAGED_ELEMENT :
 				getPackagedElements().clear();
-				getPackagedElements().addAll((Collection) newValue);
+				getPackagedElements().addAll(
+					(Collection<? extends PackageableElement>) newValue);
 				return;
 			case UMLPackage.MODEL__NESTED_PACKAGE :
 				getNestedPackages().clear();
-				getNestedPackages().addAll((Collection) newValue);
+				getNestedPackages()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Package>) newValue);
 				return;
 			case UMLPackage.MODEL__NESTING_PACKAGE :
 				setNestingPackage((org.eclipse.uml2.uml.Package) newValue);
 				return;
 			case UMLPackage.MODEL__PROFILE_APPLICATION :
 				getProfileApplications().clear();
-				getProfileApplications().addAll((Collection) newValue);
+				getProfileApplications().addAll(
+					(Collection<? extends ProfileApplication>) newValue);
 				return;
 			case UMLPackage.MODEL__VIEWPOINT :
 				setViewpoint((String) newValue);
@@ -319,6 +346,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MODEL__EANNOTATIONS :
@@ -390,6 +418,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MODEL__EANNOTATIONS :
@@ -459,6 +488,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MultiplicityElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MultiplicityElementImpl.java
index 3e2bdd6..74de151 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MultiplicityElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/MultiplicityElementImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MultiplicityElementImpl.java,v 1.23 2006/11/14 18:02:17 khussey Exp $
+ * $Id: MultiplicityElementImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,6 +35,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.MultiplicityElement;
 import org.eclipse.uml2.uml.Type;
@@ -160,6 +162,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.MULTIPLICITY_ELEMENT;
 	}
@@ -169,23 +172,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -507,7 +512,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGt0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGt0(this,
 			diagnostics, context);
 	}
@@ -517,7 +523,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateLowerGe0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateLowerGe0(this,
 			diagnostics, context);
 	}
@@ -527,7 +534,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGeLower(this,
 			diagnostics, context);
 	}
@@ -538,7 +546,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
@@ -549,7 +557,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationConstant(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationConstant(this, diagnostics, context);
 	}
@@ -622,14 +630,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
 				return basicSetUpperValue(null, msgs);
@@ -644,6 +653,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
@@ -685,15 +695,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
 				setIsOrdered(((Boolean) newValue).booleanValue());
@@ -722,6 +736,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
@@ -757,6 +772,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
@@ -788,6 +804,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -819,6 +836,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamedElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamedElementImpl.java
index 1ec3603..5190cc2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamedElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamedElementImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NamedElementImpl.java,v 1.24 2006/11/14 18:02:18 khussey Exp $
+ * $Id: NamedElementImpl.java,v 1.25 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -37,6 +37,7 @@
 
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.common.util.UML2Util;
 
 import org.eclipse.uml2.uml.Dependency;
@@ -150,7 +151,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList clientDependencies = null;
+	protected EList<Dependency> clientDependencies = null;
 
 	/**
 	 * The cached value of the '{@link #getNameExpression() <em>Name Expression</em>}' containment reference.
@@ -176,6 +177,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.NAMED_ELEMENT;
 	}
@@ -185,23 +187,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -325,9 +329,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new EObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new EObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this,
 				UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY,
 				UMLPackage.DEPENDENCY__CLIENT);
@@ -351,9 +355,7 @@
 	 */
 	public Dependency getClientDependency(String name, boolean ignoreCase,
 			EClass eClass) {
-		clientDependencyLoop : for (Iterator i = getClientDependencies()
-			.iterator(); i.hasNext();) {
-			Dependency clientDependency = (Dependency) i.next();
+		clientDependencyLoop : for (Dependency clientDependency : getClientDependencies()) {
 			if (eClass != null && !eClass.isInstance(clientDependency))
 				continue clientDependencyLoop;
 			if (name != null && !(ignoreCase
@@ -475,7 +477,7 @@
 	 * @generated
 	 */
 	public boolean validateHasNoQualifiedName(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return NamedElementOperations.validateHasNoQualifiedName(this,
 			diagnostics, context);
 	}
@@ -486,7 +488,7 @@
 	 * @generated
 	 */
 	public boolean validateHasQualifiedName(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return NamedElementOperations.validateHasQualifiedName(this,
 			diagnostics, context);
 	}
@@ -497,7 +499,7 @@
 	 * @generated
 	 */
 	public boolean validateVisibilityNeedsOwnership(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return NamedElementOperations.validateVisibilityNeedsOwnership(this,
 			diagnostics, context);
 	}
@@ -534,10 +536,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allNamespaces() {
+	public EList<Namespace> allNamespaces() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Namespace> result = (EList<Namespace>) cache.get(this,
 				UMLPackage.Literals.NAMED_ELEMENT.getEOperations().get(7));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMED_ELEMENT
@@ -572,11 +575,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allOwningPackages() {
+	public EList<org.eclipse.uml2.uml.Package> allOwningPackages() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMED_ELEMENT.getEOperations().get(10));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
+				.get(this, UMLPackage.Literals.NAMED_ELEMENT.getEOperations()
+					.get(10));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMED_ELEMENT
 					.getEOperations().get(10), result = NamedElementOperations
@@ -592,15 +597,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -610,18 +617,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 		}
@@ -633,6 +641,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
@@ -670,15 +679,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.NAMED_ELEMENT__NAME :
 				setName((String) newValue);
@@ -688,7 +701,8 @@
 				return;
 			case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -702,6 +716,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
@@ -731,6 +746,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
@@ -765,6 +781,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -856,6 +873,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || isSetNamespace();
 	}
@@ -877,11 +895,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION);
 	}
 
+	@Override
 	public String eURIFragmentSegment(EStructuralFeature eStructuralFeature,
 			EObject eObject) {
 
@@ -891,10 +911,7 @@
 			if (!UML2Util.isEmpty(name)) {
 				int count = 0;
 
-				for (Iterator eContents = eContents().iterator(); eContents
-					.hasNext();) {
-
-					Object otherEObject = eContents.next();
+				for (EObject otherEObject : eContents()) {
 
 					if (otherEObject == eObject) {
 						break;
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamespaceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamespaceImpl.java
index 27567a8..2b298bb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamespaceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NamespaceImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NamespaceImpl.java,v 1.21 2006/11/14 18:02:20 khussey Exp $
+ * $Id: NamespaceImpl.java,v 1.22 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,7 +33,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.NamedElement;
@@ -77,7 +79,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList elementImports = null;
+	protected EList<ElementImport> elementImports = null;
 
 	/**
 	 * The cached value of the '{@link #getPackageImports() <em>Package Import</em>}' containment reference list.
@@ -87,7 +89,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList packageImports = null;
+	protected EList<PackageImport> packageImports = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedRules() <em>Owned Rule</em>}' containment reference list.
@@ -97,7 +99,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedRules = null;
+	protected EList<Constraint> ownedRules = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -113,6 +115,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.NAMESPACE;
 	}
@@ -122,23 +125,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.NAMESPACE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.NAMESPACE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.NAMESPACE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -147,25 +152,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.NAMESPACE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.NAMESPACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.NAMESPACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -184,9 +190,7 @@
 	 */
 	public NamedElement getOwnedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		ownedMemberLoop : for (Iterator i = getOwnedMembers().iterator(); i
-			.hasNext();) {
-			NamedElement ownedMember = (NamedElement) i.next();
+		ownedMemberLoop : for (NamedElement ownedMember : getOwnedMembers()) {
 			if (eClass != null && !eClass.isInstance(ownedMember))
 				continue ownedMemberLoop;
 			if (name != null && !(ignoreCase
@@ -203,23 +207,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS));
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this, UMLPackage.NAMESPACE__MEMBER,
+						MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -237,8 +243,7 @@
 	 * @generated
 	 */
 	public NamedElement getMember(String name, boolean ignoreCase, EClass eClass) {
-		memberLoop : for (Iterator i = getMembers().iterator(); i.hasNext();) {
-			NamedElement member = (NamedElement) i.next();
+		memberLoop : for (NamedElement member : getMembers()) {
 			if (eClass != null && !eClass.isInstance(member))
 				continue memberLoop;
 			if (name != null && !(ignoreCase
@@ -255,9 +260,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getElementImports() {
+	public EList<ElementImport> getElementImports() {
 		if (elementImports == null) {
-			elementImports = new EObjectContainmentWithInverseEList.Resolving(
+			elementImports = new EObjectContainmentWithInverseEList.Resolving<ElementImport>(
 				ElementImport.class, this,
 				UMLPackage.NAMESPACE__ELEMENT_IMPORT,
 				UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
@@ -294,9 +299,7 @@
 	 */
 	public ElementImport getElementImport(PackageableElement importedElement,
 			boolean createOnDemand) {
-		elementImportLoop : for (Iterator i = getElementImports().iterator(); i
-			.hasNext();) {
-			ElementImport elementImport = (ElementImport) i.next();
+		elementImportLoop : for (ElementImport elementImport : getElementImports()) {
 			if (importedElement != null
 				&& !importedElement.equals(elementImport.getImportedElement()))
 				continue elementImportLoop;
@@ -312,9 +315,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackageImports() {
+	public EList<PackageImport> getPackageImports() {
 		if (packageImports == null) {
-			packageImports = new EObjectContainmentWithInverseEList.Resolving(
+			packageImports = new EObjectContainmentWithInverseEList.Resolving<PackageImport>(
 				PackageImport.class, this,
 				UMLPackage.NAMESPACE__PACKAGE_IMPORT,
 				UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
@@ -353,9 +356,7 @@
 	 */
 	public PackageImport getPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage, boolean createOnDemand) {
-		packageImportLoop : for (Iterator i = getPackageImports().iterator(); i
-			.hasNext();) {
-			PackageImport packageImport = (PackageImport) i.next();
+		packageImportLoop : for (PackageImport packageImport : getPackageImports()) {
 			if (importedPackage != null
 				&& !importedPackage.equals(packageImport.getImportedPackage()))
 				continue packageImportLoop;
@@ -371,9 +372,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedRules() {
+	public EList<Constraint> getOwnedRules() {
 		if (ownedRules == null) {
-			ownedRules = new EObjectContainmentWithInverseEList.Resolving(
+			ownedRules = new EObjectContainmentWithInverseEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.NAMESPACE__OWNED_RULE,
 				UMLPackage.CONSTRAINT__CONTEXT);
 		}
@@ -418,9 +419,7 @@
 	 */
 	public Constraint getOwnedRule(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedRuleLoop : for (Iterator i = getOwnedRules().iterator(); i
-			.hasNext();) {
-			Constraint ownedRule = (Constraint) i.next();
+		ownedRuleLoop : for (Constraint ownedRule : getOwnedRules()) {
 			if (eClass != null && !eClass.isInstance(ownedRule))
 				continue ownedRuleLoop;
 			if (name != null && !(ignoreCase
@@ -439,12 +438,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedMembers() {
+	public EList<PackageableElement> getImportedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER,
 					result = NamespaceOperations.getImportedMembers(this));
@@ -470,9 +470,7 @@
 	 */
 	public PackageableElement getImportedMember(String name,
 			boolean ignoreCase, EClass eClass) {
-		importedMemberLoop : for (Iterator i = getImportedMembers().iterator(); i
-			.hasNext();) {
-			PackageableElement importedMember = (PackageableElement) i.next();
+		importedMemberLoop : for (PackageableElement importedMember : getImportedMembers()) {
 			if (eClass != null && !eClass.isInstance(importedMember))
 				continue importedMemberLoop;
 			if (name != null && !(ignoreCase
@@ -490,7 +488,7 @@
 	 * @generated
 	 */
 	public boolean validateMembersDistinguishable(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return NamespaceOperations.validateMembersDistinguishable(this,
 			diagnostics, context);
 	}
@@ -522,11 +520,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedElements() {
+	public EList<PackageableElement> getImportedElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE.getEOperations().get(3));
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE.getEOperations()
+					.get(3));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE.getEOperations()
 					.get(3), result = NamespaceOperations
@@ -542,11 +542,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedPackages() {
+	public EList<org.eclipse.uml2.uml.Package> getImportedPackages() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE.getEOperations().get(4));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE.getEOperations()
+					.get(4));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE.getEOperations()
 					.get(4), result = NamespaceOperations
@@ -562,7 +564,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNamesOfMember(NamedElement element) {
+	public EList<String> getNamesOfMember(NamedElement element) {
 		return NamespaceOperations.getNamesOfMember(this, element);
 	}
 
@@ -580,7 +582,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList importMembers(EList imps) {
+	public EList<PackageableElement> importMembers(
+			EList<PackageableElement> imps) {
 		return NamespaceOperations.importMembers(this, imps);
 	}
 
@@ -589,7 +592,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList excludeCollisions(EList imps) {
+	public EList<PackageableElement> excludeCollisions(
+			EList<PackageableElement> imps) {
 		return NamespaceOperations.excludeCollisions(this, imps);
 	}
 
@@ -598,24 +602,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -625,29 +631,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -657,6 +664,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
@@ -706,15 +714,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.NAMESPACE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.NAMESPACE__NAME :
 				setName((String) newValue);
@@ -724,22 +736,26 @@
 				return;
 			case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.NAMESPACE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -750,6 +766,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
@@ -788,6 +805,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NAMESPACE__EANNOTATIONS :
@@ -849,6 +867,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.NAMESPACE__ELEMENT_IMPORT)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NodeImpl.java
index 8e75d89..7cb326b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/NodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NodeImpl.java,v 1.26 2006/11/14 18:02:19 khussey Exp $
+ * $Id: NodeImpl.java,v 1.27 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,18 +36,35 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.DeploymentTarget;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Node;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.DeploymentTargetOperations;
@@ -83,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList deployments = null;
+	protected EList<Deployment> deployments = null;
 
 	/**
 	 * The cached value of the '{@link #getNestedNodes() <em>Nested Node</em>}' containment reference list.
@@ -93,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nestedNodes = null;
+	protected EList<Node> nestedNodes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -109,6 +126,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.NODE;
 	}
@@ -118,23 +136,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.NODE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -143,9 +162,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this, UMLPackage.NODE__CLIENT_DEPENDENCY,
 				null, CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
 		}
@@ -157,9 +176,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployments() {
+	public EList<Deployment> getDeployments() {
 		if (deployments == null) {
-			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Deployment>(
 				Deployment.class, this, UMLPackage.NODE__DEPLOYMENT,
 				DEPLOYMENT_ESUPERSETS, null, UMLPackage.DEPLOYMENT__LOCATION);
 		}
@@ -195,9 +214,7 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Iterator i = getDeployments().iterator(); i
-			.hasNext();) {
-			Deployment deployment = (Deployment) i.next();
+		deploymentLoop : for (Deployment deployment : getDeployments()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(deployment.getName())
 				: name.equals(deployment.getName())))
@@ -214,12 +231,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployedElements() {
+	public EList<PackageableElement> getDeployedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this,
+					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
 			if (result == null) {
 				cache.put(this,
 					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT,
@@ -247,9 +266,7 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (Iterator i = getDeployedElements()
-			.iterator(); i.hasNext();) {
-			PackageableElement deployedElement = (PackageableElement) i.next();
+		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
 			if (name != null && !(ignoreCase
@@ -266,24 +283,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -291,10 +309,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNestedNodes() {
+	public EList<Node> getNestedNodes() {
 		if (nestedNodes == null) {
-			nestedNodes = new EObjectContainmentEList.Resolving(Node.class,
-				this, UMLPackage.NODE__NESTED_NODE);
+			nestedNodes = new EObjectContainmentEList.Resolving<Node>(
+				Node.class, this, UMLPackage.NODE__NESTED_NODE);
 		}
 		return nestedNodes;
 	}
@@ -337,9 +355,7 @@
 	 */
 	public Node getNestedNode(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		nestedNodeLoop : for (Iterator i = getNestedNodes().iterator(); i
-			.hasNext();) {
-			Node nestedNode = (Node) i.next();
+		nestedNodeLoop : for (Node nestedNode : getNestedNodes()) {
 			if (eClass != null && !eClass.isInstance(nestedNode))
 				continue nestedNodeLoop;
 			if (name != null && !(ignoreCase
@@ -359,7 +375,7 @@
 	 * @generated
 	 */
 	public boolean validateInternalStructure(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return NodeOperations.validateInternalStructure(this, diagnostics,
 			context);
 	}
@@ -369,24 +385,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -401,8 +419,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.NODE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -412,25 +430,26 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.NODE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.NODE__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -440,86 +459,87 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.NODE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.NODE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.NODE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.NODE__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getDeployments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.NODE__NESTED_NODE :
-				return ((InternalEList) getNestedNodes()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getNestedNodes()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -529,6 +549,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
@@ -674,15 +695,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.NODE__NAME :
 				setName((String) newValue);
@@ -692,22 +717,26 @@
 				return;
 			case UMLPackage.NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.NODE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.NODE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.NODE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -723,7 +752,8 @@
 				return;
 			case UMLPackage.NODE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -733,92 +763,110 @@
 				return;
 			case UMLPackage.NODE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.NODE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.NODE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.NODE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.NODE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.NODE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.NODE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.NODE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.NODE__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.NODE__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.NODE__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.NODE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.NODE__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.NODE__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.NODE__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.NODE__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 			case UMLPackage.NODE__NESTED_NODE :
 				getNestedNodes().clear();
-				getNestedNodes().addAll((Collection) newValue);
+				getNestedNodes().addAll((Collection<? extends Node>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -829,6 +877,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
@@ -957,6 +1006,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.NODE__EANNOTATIONS :
@@ -1085,7 +1135,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == DeploymentTarget.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.NODE__DEPLOYMENT :
@@ -1104,7 +1155,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == DeploymentTarget.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
@@ -1162,6 +1214,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.NODE__DEPLOYMENT);
@@ -1187,6 +1240,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.NODE__NESTED_NODE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectFlowImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectFlowImpl.java
index 481b090..dff4a27 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectFlowImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectFlowImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectFlowImpl.java,v 1.14 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ObjectFlowImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,14 +19,19 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectFlow;
 import org.eclipse.uml2.uml.StringExpression;
@@ -131,6 +136,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OBJECT_FLOW;
 	}
@@ -283,7 +289,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoActions(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoActions(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateNoActions(this, diagnostics,
 			context);
 	}
@@ -294,7 +301,7 @@
 	 * @generated
 	 */
 	public boolean validateCompatibleTypes(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateCompatibleTypes(this, diagnostics,
 			context);
 	}
@@ -305,7 +312,7 @@
 	 * @generated
 	 */
 	public boolean validateSameUpperBounds(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateSameUpperBounds(this, diagnostics,
 			context);
 	}
@@ -315,7 +322,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTarget(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTarget(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateTarget(this, diagnostics, context);
 	}
 
@@ -325,7 +333,7 @@
 	 * @generated
 	 */
 	public boolean validateTransformationBehaviour(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateTransformationBehaviour(this,
 			diagnostics, context);
 	}
@@ -336,7 +344,7 @@
 	 * @generated
 	 */
 	public boolean validateSelectionBehaviour(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateSelectionBehaviour(this,
 			diagnostics, context);
 	}
@@ -347,7 +355,7 @@
 	 * @generated
 	 */
 	public boolean validateInputAndOutputParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectFlowOperations.validateInputAndOutputParameter(this,
 			diagnostics, context);
 	}
@@ -358,7 +366,7 @@
 	 * @generated
 	 */
 	public boolean validateIsMulticastOrIsMultireceive(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ObjectFlowOperations.validateIsMulticastOrIsMultireceive(this,
 			diagnostics, context);
 	}
@@ -368,6 +376,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
@@ -463,15 +472,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OBJECT_FLOW__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OBJECT_FLOW__NAME :
 				setName((String) newValue);
@@ -481,7 +494,8 @@
 				return;
 			case UMLPackage.OBJECT_FLOW__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -497,11 +511,13 @@
 				return;
 			case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE :
 				getRedefinedEdges().clear();
-				getRedefinedEdges().addAll((Collection) newValue);
+				getRedefinedEdges().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.OBJECT_FLOW__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.OBJECT_FLOW__GUARD :
 				setGuard((ValueSpecification) newValue);
@@ -539,6 +555,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
@@ -610,6 +627,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
@@ -678,6 +696,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectNodeImpl.java
index 88fd7f0..d40a8a0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObjectNodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectNodeImpl.java,v 1.21 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ObjectNodeImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,8 +37,14 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectNode;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
 import org.eclipse.uml2.uml.State;
@@ -143,7 +149,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inStates = null;
+	protected EList<State> inStates = null;
 
 	/**
 	 * The cached value of the '{@link #getSelection() <em>Selection</em>}' reference.
@@ -169,6 +175,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OBJECT_NODE;
 	}
@@ -220,23 +227,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.OBJECT_NODE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.OBJECT_NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.OBJECT_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -403,9 +412,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInStates() {
+	public EList<State> getInStates() {
 		if (inStates == null) {
-			inStates = new EObjectResolvingEList(State.class, this,
+			inStates = new EObjectResolvingEList<State>(State.class, this,
 				UMLPackage.OBJECT_NODE__IN_STATE);
 		}
 		return inStates;
@@ -426,8 +435,7 @@
 	 * @generated
 	 */
 	public State getInState(String name, boolean ignoreCase, EClass eClass) {
-		inStateLoop : for (Iterator i = getInStates().iterator(); i.hasNext();) {
-			State inState = (State) i.next();
+		inStateLoop : for (State inState : getInStates()) {
 			if (eClass != null && !eClass.isInstance(inState))
 				continue inStateLoop;
 			if (name != null && !(ignoreCase
@@ -488,7 +496,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlowEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectNodeOperations.validateObjectFlowEdges(this, diagnostics,
 			context);
 	}
@@ -498,7 +506,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotUnique(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotUnique(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ObjectNodeOperations.validateNotUnique(this, diagnostics,
 			context);
 	}
@@ -509,7 +518,7 @@
 	 * @generated
 	 */
 	public boolean validateSelectionBehavior(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectNodeOperations.validateSelectionBehavior(this,
 			diagnostics, context);
 	}
@@ -520,7 +529,7 @@
 	 * @generated
 	 */
 	public boolean validateInputOutputParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ObjectNodeOperations.validateInputOutputParameter(this,
 			diagnostics, context);
 	}
@@ -530,18 +539,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
@@ -549,16 +559,16 @@
 			case UMLPackage.OBJECT_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.OBJECT_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
 				return basicSetUpperBound(null, msgs);
@@ -571,6 +581,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
@@ -656,15 +667,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__NAME :
 				setName((String) newValue);
@@ -674,7 +689,8 @@
 				return;
 			case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -690,23 +706,29 @@
 				return;
 			case UMLPackage.OBJECT_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__TYPE :
 				setType((Type) newValue);
@@ -722,7 +744,7 @@
 				return;
 			case UMLPackage.OBJECT_NODE__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.OBJECT_NODE__SELECTION :
 				setSelection((Behavior) newValue);
@@ -736,6 +758,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
@@ -807,6 +830,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
@@ -876,7 +900,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.OBJECT_NODE__TYPE :
@@ -893,7 +918,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.TYPED_ELEMENT__TYPE :
@@ -910,6 +936,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -941,6 +968,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.OBJECT_NODE__UPPER_BOUND);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObservationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObservationImpl.java
index e549e3a..3147241 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObservationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ObservationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObservationImpl.java,v 1.2 2006/01/04 17:47:24 khussey Exp $
+ * $Id: ObservationImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OBSERVATION;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OccurrenceSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OccurrenceSpecificationImpl.java
index 520a92c..a403690 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OccurrenceSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OccurrenceSpecificationImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OccurrenceSpecificationImpl.java,v 1.17 2006/11/14 18:02:16 khussey Exp $
+ * $Id: OccurrenceSpecificationImpl.java,v 1.18 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -27,6 +27,8 @@
 import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Event;
 import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
@@ -65,7 +67,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList toBefores = null;
+	protected EList<GeneralOrdering> toBefores = null;
 
 	/**
 	 * The cached value of the '{@link #getEvent() <em>Event</em>}' reference.
@@ -85,7 +87,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList toAfters = null;
+	protected EList<GeneralOrdering> toAfters = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -101,6 +103,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OCCURRENCE_SPECIFICATION;
 	}
@@ -110,9 +113,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getToBefores() {
+	public EList<GeneralOrdering> getToBefores() {
 		if (toBefores == null) {
-			toBefores = new EObjectWithInverseResolvingEList(
+			toBefores = new EObjectWithInverseResolvingEList<GeneralOrdering>(
 				GeneralOrdering.class, this,
 				UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE,
 				UMLPackage.GENERAL_ORDERING__AFTER);
@@ -135,8 +138,7 @@
 	 * @generated
 	 */
 	public GeneralOrdering getToBefore(String name, boolean ignoreCase) {
-		toBeforeLoop : for (Iterator i = getToBefores().iterator(); i.hasNext();) {
-			GeneralOrdering toBefore = (GeneralOrdering) i.next();
+		toBeforeLoop : for (GeneralOrdering toBefore : getToBefores()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(toBefore.getName())
 				: name.equals(toBefore.getName())))
@@ -194,9 +196,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getToAfters() {
+	public EList<GeneralOrdering> getToAfters() {
 		if (toAfters == null) {
-			toAfters = new EObjectWithInverseResolvingEList(
+			toAfters = new EObjectWithInverseResolvingEList<GeneralOrdering>(
 				GeneralOrdering.class, this,
 				UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER,
 				UMLPackage.GENERAL_ORDERING__BEFORE);
@@ -219,8 +221,7 @@
 	 * @generated
 	 */
 	public GeneralOrdering getToAfter(String name, boolean ignoreCase) {
-		toAfterLoop : for (Iterator i = getToAfters().iterator(); i.hasNext();) {
-			GeneralOrdering toAfter = (GeneralOrdering) i.next();
+		toAfterLoop : for (GeneralOrdering toAfter : getToAfters()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(toAfter.getName())
 				: name.equals(toAfter.getName())))
@@ -235,9 +236,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCovereds() {
+	public EList<Lifeline> getCovereds() {
 		if (covereds == null) {
-			covereds = new EObjectWithInverseResolvingEList.ManyInverse(
+			covereds = new EObjectWithInverseResolvingEList.ManyInverse<Lifeline>(
 				Lifeline.class, this,
 				UMLPackage.OCCURRENCE_SPECIFICATION__COVERED,
 				UMLPackage.LIFELINE__COVERED_BY);
@@ -250,6 +251,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Lifeline getCovered(String name) {
 		return getCovered(name, false);
 	}
@@ -259,9 +261,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Iterator i = getCovereds().iterator(); i.hasNext();) {
-			Lifeline covered = (Lifeline) i.next();
+		coveredLoop : for (Lifeline covered : getCovereds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(covered.getName())
 				: name.equals(covered.getName())))
@@ -285,17 +287,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return ((InternalEList) getCovereds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -307,10 +312,11 @@
 				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
 					msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return ((InternalEList) getToBefores())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getToBefores())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return ((InternalEList) getToAfters()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getToAfters())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -320,35 +326,36 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
 				return basicSetEnclosingOperand(null, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return ((InternalEList) getToBefores()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getToBefores()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return ((InternalEList) getToAfters()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getToAfters()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -359,6 +366,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -416,15 +424,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -434,18 +446,20 @@
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -455,14 +469,16 @@
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
 				getToBefores().clear();
-				getToBefores().addAll((Collection) newValue);
+				getToBefores().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EVENT :
 				setEvent((Event) newValue);
 				return;
 			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
 				getToAfters().clear();
-				getToAfters().addAll((Collection) newValue);
+				getToAfters().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -473,6 +489,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
@@ -523,6 +540,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueActionImpl.java
index 5887bf9..5d3d25d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueActionImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueActionImpl.java,v 1.20 2006/11/14 18:02:16 khussey Exp $
+ * $Id: OpaqueActionImpl.java,v 1.21 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,7 +33,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OpaqueAction;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
@@ -72,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodies = null;
+	protected EList<String> bodies = null;
 
 	/**
 	 * The cached value of the '{@link #getLanguages() <em>Language</em>}' attribute list.
@@ -82,7 +90,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList languages = null;
+	protected EList<String> languages = null;
 
 	/**
 	 * The cached value of the '{@link #getInputValues() <em>Input Value</em>}' containment reference list.
@@ -92,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList inputValues = null;
+	protected EList<InputPin> inputValues = null;
 
 	/**
 	 * The cached value of the '{@link #getOutputValues() <em>Output Value</em>}' containment reference list.
@@ -102,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList outputValues = null;
+	protected EList<OutputPin> outputValues = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -118,6 +126,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OPAQUE_ACTION;
 	}
@@ -127,21 +136,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.OPAQUE_ACTION__INPUT, INPUT_ESUBSETS));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.OPAQUE_ACTION__INPUT,
+						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.OPAQUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -150,23 +161,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache
-					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-						outputs = new DerivedUnionEObjectEList(OutputPin.class,
-							this, UMLPackage.OPAQUE_ACTION__OUTPUT,
-							OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.OPAQUE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.OPAQUE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -175,9 +186,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodies() {
+	public EList<String> getBodies() {
 		if (bodies == null) {
-			bodies = new EDataTypeEList.Unsettable(String.class, this,
+			bodies = new EDataTypeEList.Unsettable<String>(String.class, this,
 				UMLPackage.OPAQUE_ACTION__BODY);
 		}
 		return bodies;
@@ -190,7 +201,7 @@
 	 */
 	public void unsetBodies() {
 		if (bodies != null)
-			((InternalEList.Unsettable) bodies).unset();
+			((InternalEList.Unsettable<?>) bodies).unset();
 	}
 
 	/**
@@ -199,7 +210,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return bodies != null && ((InternalEList.Unsettable) bodies).isSet();
+		return bodies != null && ((InternalEList.Unsettable<?>) bodies).isSet();
 	}
 
 	/**
@@ -207,10 +218,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLanguages() {
+	public EList<String> getLanguages() {
 		if (languages == null) {
-			languages = new EDataTypeUniqueEList.Unsettable(String.class, this,
-				UMLPackage.OPAQUE_ACTION__LANGUAGE);
+			languages = new EDataTypeUniqueEList.Unsettable<String>(
+				String.class, this, UMLPackage.OPAQUE_ACTION__LANGUAGE);
 		}
 		return languages;
 	}
@@ -222,7 +233,7 @@
 	 */
 	public void unsetLanguages() {
 		if (languages != null)
-			((InternalEList.Unsettable) languages).unset();
+			((InternalEList.Unsettable<?>) languages).unset();
 	}
 
 	/**
@@ -232,7 +243,7 @@
 	 */
 	public boolean isSetLanguages() {
 		return languages != null
-			&& ((InternalEList.Unsettable) languages).isSet();
+			&& ((InternalEList.Unsettable<?>) languages).isSet();
 	}
 
 	/**
@@ -240,10 +251,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputValues() {
+	public EList<InputPin> getInputValues() {
 		if (inputValues == null) {
-			inputValues = new EObjectContainmentEList.Resolving(InputPin.class,
-				this, UMLPackage.OPAQUE_ACTION__INPUT_VALUE);
+			inputValues = new EObjectContainmentEList.Resolving<InputPin>(
+				InputPin.class, this, UMLPackage.OPAQUE_ACTION__INPUT_VALUE);
 		}
 		return inputValues;
 	}
@@ -288,9 +299,7 @@
 	 */
 	public InputPin getInputValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		inputValueLoop : for (Iterator i = getInputValues().iterator(); i
-			.hasNext();) {
-			InputPin inputValue = (InputPin) i.next();
+		inputValueLoop : for (InputPin inputValue : getInputValues()) {
 			if (eClass != null && !eClass.isInstance(inputValue))
 				continue inputValueLoop;
 			if (name != null && !(ignoreCase
@@ -321,9 +330,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputValues() {
+	public EList<OutputPin> getOutputValues() {
 		if (outputValues == null) {
-			outputValues = new EObjectContainmentEList.Resolving(
+			outputValues = new EObjectContainmentEList.Resolving<OutputPin>(
 				OutputPin.class, this, UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE);
 		}
 		return outputValues;
@@ -360,9 +369,7 @@
 	 */
 	public OutputPin getOutputValue(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		outputValueLoop : for (Iterator i = getOutputValues().iterator(); i
-			.hasNext();) {
-			OutputPin outputValue = (OutputPin) i.next();
+		outputValueLoop : for (OutputPin outputValue : getOutputValues()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(outputValue.getName())
 				: name.equals(outputValue.getName())))
@@ -381,18 +388,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
@@ -400,31 +408,31 @@
 			case UMLPackage.OPAQUE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				return ((InternalEList) getInputValues()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getInputValues()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				return ((InternalEList) getOutputValues()).basicRemove(
+				return ((InternalEList<?>) getOutputValues()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -444,6 +452,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
@@ -531,15 +540,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__NAME :
 				setName((String) newValue);
@@ -549,7 +562,8 @@
 				return;
 			case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -565,51 +579,62 @@
 				return;
 			case UMLPackage.OPAQUE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__BODY :
 				getBodies().clear();
-				getBodies().addAll((Collection) newValue);
+				getBodies().addAll((Collection<? extends String>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__LANGUAGE :
 				getLanguages().clear();
-				getLanguages().addAll((Collection) newValue);
+				getLanguages().addAll((Collection<? extends String>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
 				getInputValues().clear();
-				getInputValues().addAll((Collection) newValue);
+				getInputValues().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
 				getOutputValues().clear();
-				getOutputValues().addAll((Collection) newValue);
+				getOutputValues().addAll(
+					(Collection<? extends OutputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -620,6 +645,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
@@ -694,6 +720,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
@@ -773,6 +800,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -801,6 +829,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.OPAQUE_ACTION__INPUT_VALUE);
@@ -821,6 +850,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueBehaviorImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueBehaviorImpl.java
index 70ec78d..9478868 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueBehaviorImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueBehaviorImpl.java
@@ -8,13 +8,14 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueBehaviorImpl.java,v 1.19 2006/10/10 20:41:28 khussey Exp $
+ * $Id: OpaqueBehaviorImpl.java,v 1.20 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.util.EDataTypeEList;
 import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
@@ -23,12 +24,32 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.OpaqueBehavior;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 /**
@@ -57,7 +78,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodies = null;
+	protected EList<String> bodies = null;
 
 	/**
 	 * The cached value of the '{@link #getLanguages() <em>Language</em>}' attribute list.
@@ -67,7 +88,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList languages = null;
+	protected EList<String> languages = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -83,6 +104,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OPAQUE_BEHAVIOR;
 	}
@@ -92,9 +114,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodies() {
+	public EList<String> getBodies() {
 		if (bodies == null) {
-			bodies = new EDataTypeEList.Unsettable(String.class, this,
+			bodies = new EDataTypeEList.Unsettable<String>(String.class, this,
 				UMLPackage.OPAQUE_BEHAVIOR__BODY);
 		}
 		return bodies;
@@ -107,7 +129,7 @@
 	 */
 	public void unsetBodies() {
 		if (bodies != null)
-			((InternalEList.Unsettable) bodies).unset();
+			((InternalEList.Unsettable<?>) bodies).unset();
 	}
 
 	/**
@@ -116,7 +138,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return bodies != null && ((InternalEList.Unsettable) bodies).isSet();
+		return bodies != null && ((InternalEList.Unsettable<?>) bodies).isSet();
 	}
 
 	/**
@@ -124,10 +146,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLanguages() {
+	public EList<String> getLanguages() {
 		if (languages == null) {
-			languages = new EDataTypeUniqueEList.Unsettable(String.class, this,
-				UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE);
+			languages = new EDataTypeUniqueEList.Unsettable<String>(
+				String.class, this, UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE);
 		}
 		return languages;
 	}
@@ -139,7 +161,7 @@
 	 */
 	public void unsetLanguages() {
 		if (languages != null)
-			((InternalEList.Unsettable) languages).unset();
+			((InternalEList.Unsettable<?>) languages).unset();
 	}
 
 	/**
@@ -149,7 +171,7 @@
 	 */
 	public boolean isSetLanguages() {
 		return languages != null
-			&& ((InternalEList.Unsettable) languages).isSet();
+			&& ((InternalEList.Unsettable<?>) languages).isSet();
 	}
 
 	/**
@@ -157,6 +179,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
@@ -322,15 +345,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__NAME :
 				setName((String) newValue);
@@ -340,22 +367,26 @@
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -371,7 +402,8 @@
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -381,118 +413,140 @@
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__BODY :
 				getBodies().clear();
-				getBodies().addAll((Collection) newValue);
+				getBodies().addAll((Collection<? extends String>) newValue);
 				return;
 			case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE :
 				getLanguages().clear();
-				getLanguages().addAll((Collection) newValue);
+				getLanguages().addAll((Collection<? extends String>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -503,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
@@ -652,6 +707,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
@@ -796,6 +852,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueExpressionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueExpressionImpl.java
index d115872..b7d3980 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueExpressionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OpaqueExpressionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueExpressionImpl.java,v 1.18 2006/11/14 18:02:18 khussey Exp $
+ * $Id: OpaqueExpressionImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -21,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,6 +33,8 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.OpaqueExpression;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.StringExpression;
@@ -70,7 +73,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList bodies = null;
+	protected EList<String> bodies = null;
 
 	/**
 	 * The cached value of the '{@link #getLanguages() <em>Language</em>}' attribute list.
@@ -80,7 +83,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList languages = null;
+	protected EList<String> languages = null;
 
 	/**
 	 * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' reference.
@@ -106,6 +109,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OPAQUE_EXPRESSION;
 	}
@@ -115,9 +119,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getBodies() {
+	public EList<String> getBodies() {
 		if (bodies == null) {
-			bodies = new EDataTypeEList.Unsettable(String.class, this,
+			bodies = new EDataTypeEList.Unsettable<String>(String.class, this,
 				UMLPackage.OPAQUE_EXPRESSION__BODY);
 		}
 		return bodies;
@@ -130,7 +134,7 @@
 	 */
 	public void unsetBodies() {
 		if (bodies != null)
-			((InternalEList.Unsettable) bodies).unset();
+			((InternalEList.Unsettable<?>) bodies).unset();
 	}
 
 	/**
@@ -139,7 +143,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return bodies != null && ((InternalEList.Unsettable) bodies).isSet();
+		return bodies != null && ((InternalEList.Unsettable<?>) bodies).isSet();
 	}
 
 	/**
@@ -147,10 +151,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getLanguages() {
+	public EList<String> getLanguages() {
 		if (languages == null) {
-			languages = new EDataTypeUniqueEList.Unsettable(String.class, this,
-				UMLPackage.OPAQUE_EXPRESSION__LANGUAGE);
+			languages = new EDataTypeUniqueEList.Unsettable<String>(
+				String.class, this, UMLPackage.OPAQUE_EXPRESSION__LANGUAGE);
 		}
 		return languages;
 	}
@@ -162,7 +166,7 @@
 	 */
 	public void unsetLanguages() {
 		if (languages != null)
-			((InternalEList.Unsettable) languages).unset();
+			((InternalEList.Unsettable<?>) languages).unset();
 	}
 
 	/**
@@ -172,7 +176,7 @@
 	 */
 	public boolean isSetLanguages() {
 		return languages != null
-			&& ((InternalEList.Unsettable) languages).isSet();
+			&& ((InternalEList.Unsettable<?>) languages).isSet();
 	}
 
 	/**
@@ -246,7 +250,7 @@
 	 * @generated
 	 */
 	public boolean validateLanguageBodySize(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return OpaqueExpressionOperations.validateLanguageBodySize(this,
 			diagnostics, context);
 	}
@@ -257,7 +261,7 @@
 	 * @generated
 	 */
 	public boolean validateOnlyReturnResultParameters(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return OpaqueExpressionOperations.validateOnlyReturnResultParameters(
 			this, diagnostics, context);
 	}
@@ -268,7 +272,7 @@
 	 * @generated
 	 */
 	public boolean validateOneReturnResultParameter(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return OpaqueExpressionOperations.validateOneReturnResultParameter(
 			this, diagnostics, context);
 	}
@@ -323,6 +327,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
@@ -384,15 +389,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__NAME :
 				setName((String) newValue);
@@ -402,7 +411,8 @@
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -418,11 +428,11 @@
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__BODY :
 				getBodies().clear();
-				getBodies().addAll((Collection) newValue);
+				getBodies().addAll((Collection<? extends String>) newValue);
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE :
 				getLanguages().clear();
-				getLanguages().addAll((Collection) newValue);
+				getLanguages().addAll((Collection<? extends String>) newValue);
 				return;
 			case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR :
 				setBehavior((Behavior) newValue);
@@ -436,6 +446,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
@@ -483,6 +494,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
@@ -531,6 +543,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationImpl.java
index fb82fd1..3d1b517 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OperationImpl.java,v 1.31 2006/11/14 18:02:17 khussey Exp $
+ * $Id: OperationImpl.java,v 1.32 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -41,16 +41,22 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.CallConcurrencyKind;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.OperationTemplateParameter;
 import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -126,7 +132,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -206,7 +212,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList preconditions = null;
+	protected EList<Constraint> preconditions = null;
 
 	/**
 	 * The cached value of the '{@link #getPostconditions() <em>Postcondition</em>}' reference list.
@@ -216,7 +222,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList postconditions = null;
+	protected EList<Constraint> postconditions = null;
 
 	/**
 	 * The cached value of the '{@link #getRedefinedOperations() <em>Redefined Operation</em>}' reference list.
@@ -226,7 +232,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedOperations = null;
+	protected EList<Operation> redefinedOperations = null;
 
 	/**
 	 * The cached value of the '{@link #getBodyCondition() <em>Body Condition</em>}' reference.
@@ -252,6 +258,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OPERATION;
 	}
@@ -461,23 +468,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.OPERATION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.OPERATION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.OPERATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -486,9 +495,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.OPERATION__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -525,9 +534,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -656,27 +663,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class, this,
 							UMLPackage.OPERATION__REDEFINITION_CONTEXT,
 							REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.OPERATION__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -686,24 +697,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeaturingClassifiers() {
+	public EList<Classifier> getFeaturingClassifiers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.OPERATION__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class, this,
+							UMLPackage.OPERATION__FEATURING_CLASSIFIER,
+							FEATURING_CLASSIFIER_ESUBSETS));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.OPERATION__FEATURING_CLASSIFIER,
 			FEATURING_CLASSIFIER_ESUBSETS);
 	}
@@ -713,24 +729,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.OPERATION__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.OPERATION__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.OPERATION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -739,9 +761,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedRules() {
+	public EList<Constraint> getOwnedRules() {
 		if (ownedRules == null) {
-			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.OPERATION__OWNED_RULE, null,
 				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 		}
@@ -923,9 +945,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPreconditions() {
+	public EList<Constraint> getPreconditions() {
 		if (preconditions == null) {
-			preconditions = new SubsetSupersetEObjectResolvingEList(
+			preconditions = new SubsetSupersetEObjectResolvingEList<Constraint>(
 				Constraint.class, this, UMLPackage.OPERATION__PRECONDITION,
 				PRECONDITION_ESUPERSETS, null);
 		}
@@ -970,9 +992,7 @@
 	 */
 	public Constraint getPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		preconditionLoop : for (Iterator i = getPreconditions().iterator(); i
-			.hasNext();) {
-			Constraint precondition = (Constraint) i.next();
+		preconditionLoop : for (Constraint precondition : getPreconditions()) {
 			if (eClass != null && !eClass.isInstance(precondition))
 				continue preconditionLoop;
 			if (name != null && !(ignoreCase
@@ -991,9 +1011,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPostconditions() {
+	public EList<Constraint> getPostconditions() {
 		if (postconditions == null) {
-			postconditions = new SubsetSupersetEObjectResolvingEList(
+			postconditions = new SubsetSupersetEObjectResolvingEList<Constraint>(
 				Constraint.class, this, UMLPackage.OPERATION__POSTCONDITION,
 				POSTCONDITION_ESUPERSETS, null);
 		}
@@ -1038,9 +1058,7 @@
 	 */
 	public Constraint getPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		postconditionLoop : for (Iterator i = getPostconditions().iterator(); i
-			.hasNext();) {
-			Constraint postcondition = (Constraint) i.next();
+		postconditionLoop : for (Constraint postcondition : getPostconditions()) {
 			if (eClass != null && !eClass.isInstance(postcondition))
 				continue postconditionLoop;
 			if (name != null && !(ignoreCase
@@ -1059,10 +1077,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedOperations() {
+	public EList<Operation> getRedefinedOperations() {
 		if (redefinedOperations == null) {
-			redefinedOperations = new EObjectResolvingEList(Operation.class,
-				this, UMLPackage.OPERATION__REDEFINED_OPERATION);
+			redefinedOperations = new EObjectResolvingEList<Operation>(
+				Operation.class, this,
+				UMLPackage.OPERATION__REDEFINED_OPERATION);
 		}
 		return redefinedOperations;
 	}
@@ -1073,7 +1092,7 @@
 	 * @generated
 	 */
 	public Operation getRedefinedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes) {
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getRedefinedOperation(name, ownedParameterNames,
 			ownedParameterTypes, false);
 	}
@@ -1084,27 +1103,25 @@
 	 * @generated
 	 */
 	public Operation getRedefinedOperation(String name,
-			EList ownedParameterNames, EList ownedParameterTypes,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
 			boolean ignoreCase) {
-		redefinedOperationLoop : for (Iterator i = getRedefinedOperations()
-			.iterator(); i.hasNext();) {
-			Operation redefinedOperation = (Operation) i.next();
+		redefinedOperationLoop : for (Operation redefinedOperation : getRedefinedOperations()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(redefinedOperation.getName())
 				: name.equals(redefinedOperation.getName())))
 				continue redefinedOperationLoop;
-			EList ownedParameterList = redefinedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = redefinedOperation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue redefinedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -1227,7 +1244,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newBodyCondition != null) {
-				EList ownedRules = getOwnedRules();
+				EList<Constraint> ownedRules = getOwnedRules();
 				if (!ownedRules.contains(newBodyCondition)) {
 					ownedRules.add(newBodyCondition);
 				}
@@ -1357,9 +1374,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameters() {
+	public EList<Parameter> getOwnedParameters() {
 		if (ownedParameters == null) {
-			ownedParameters = new EObjectContainmentEList.Resolving(
+			ownedParameters = new EObjectContainmentEList.Resolving<Parameter>(
 				Parameter.class, this, UMLPackage.OPERATION__OWNED_PARAMETER);
 		}
 		return ownedParameters;
@@ -1370,6 +1387,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Parameter createOwnedParameter(String name, Type type) {
 		Parameter newOwnedParameter = (Parameter) create(UMLPackage.Literals.PARAMETER);
 		getOwnedParameters().add(newOwnedParameter);
@@ -1385,6 +1403,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Parameter getOwnedParameter(String name, Type type) {
 		return getOwnedParameter(name, type, false, false);
 	}
@@ -1394,11 +1413,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Iterator i = getOwnedParameters().iterator(); i
-			.hasNext();) {
-			Parameter ownedParameter = (Parameter) i.next();
+		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedParameter.getName())
 				: name.equals(ownedParameter.getName())))
@@ -1426,10 +1444,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRaisedExceptions() {
+	public EList<Type> getRaisedExceptions() {
 		if (raisedExceptions == null) {
-			raisedExceptions = new EObjectResolvingEList(Type.class, this,
-				UMLPackage.OPERATION__RAISED_EXCEPTION);
+			raisedExceptions = new EObjectResolvingEList<Type>(Type.class,
+				this, UMLPackage.OPERATION__RAISED_EXCEPTION);
 		}
 		return raisedExceptions;
 	}
@@ -1439,6 +1457,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Type getRaisedException(String name) {
 		return getRaisedException(name, false, null);
 	}
@@ -1448,11 +1467,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Type getRaisedException(String name, boolean ignoreCase,
 			EClass eClass) {
-		raisedExceptionLoop : for (Iterator i = getRaisedExceptions()
-			.iterator(); i.hasNext();) {
-			Type raisedException = (Type) i.next();
+		raisedExceptionLoop : for (Type raisedException : getRaisedExceptions()) {
 			if (eClass != null && !eClass.isInstance(raisedException))
 				continue raisedExceptionLoop;
 			if (name != null && !(ignoreCase
@@ -1496,12 +1514,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -1528,7 +1547,7 @@
 	 * @generated
 	 */
 	public boolean validateAtMostOneReturn(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return OperationOperations.validateAtMostOneReturn(this, diagnostics,
 			context);
 	}
@@ -1539,7 +1558,7 @@
 	 * @generated
 	 */
 	public boolean validateOnlyBodyForQuery(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return OperationOperations.validateOnlyBodyForQuery(this, diagnostics,
 			context);
 	}
@@ -1576,10 +1595,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList returnResult() {
+	public EList<Parameter> returnResult() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Parameter> result = (EList<Parameter>) cache.get(this,
 				UMLPackage.Literals.OPERATION.getEOperations().get(15));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.OPERATION.getEOperations()
@@ -1604,26 +1624,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__METHOD :
-				return ((InternalEList) getMethods()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1638,8 +1661,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -1670,44 +1693,45 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPERATION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__METHOD :
-				return ((InternalEList) getMethods()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getMethods()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
@@ -1726,6 +1750,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -1755,6 +1780,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
@@ -1888,15 +1914,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.OPERATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.OPERATION__NAME :
 				setName((String) newValue);
@@ -1906,22 +1936,26 @@
 				return;
 			case UMLPackage.OPERATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.OPERATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.OPERATION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.OPERATION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.OPERATION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPERATION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1931,25 +1965,28 @@
 				return;
 			case UMLPackage.OPERATION__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.OPERATION__IS_ABSTRACT :
 				setIsAbstract(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.OPERATION__METHOD :
 				getMethods().clear();
-				getMethods().addAll((Collection) newValue);
+				getMethods().addAll((Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.OPERATION__CONCURRENCY :
 				setConcurrency((CallConcurrencyKind) newValue);
 				return;
 			case UMLPackage.OPERATION__RAISED_EXCEPTION :
 				getRaisedExceptions().clear();
-				getRaisedExceptions().addAll((Collection) newValue);
+				getRaisedExceptions().addAll(
+					(Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -1959,7 +1996,8 @@
 				return;
 			case UMLPackage.OPERATION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -1987,15 +2025,18 @@
 				return;
 			case UMLPackage.OPERATION__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPERATION__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.OPERATION__REDEFINED_OPERATION :
 				getRedefinedOperations().clear();
-				getRedefinedOperations().addAll((Collection) newValue);
+				getRedefinedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.OPERATION__DATATYPE :
 				setDatatype((DataType) newValue);
@@ -2015,6 +2056,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
@@ -2128,6 +2170,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPERATION__EANNOTATIONS :
@@ -2232,7 +2275,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
@@ -2261,7 +2305,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -2290,6 +2335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -2320,6 +2366,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER);
@@ -2347,6 +2394,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.OPERATION__TEMPLATE_BINDING)
@@ -2382,6 +2430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
 			|| eIsSet(UMLPackage.OPERATION__INTERFACE)
@@ -2412,6 +2461,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.OPERATION__CLASS)
 			|| eIsSet(UMLPackage.OPERATION__DATATYPE);
@@ -2433,6 +2483,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeaturingClassifiers() {
 		return super.isSetFeaturingClassifiers()
 			|| eIsSet(UMLPackage.OPERATION__CLASS)
@@ -2487,6 +2538,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.OPERATION__REDEFINED_OPERATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationTemplateParameterImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationTemplateParameterImpl.java
index dd07231..cb9ae73 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationTemplateParameterImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OperationTemplateParameterImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OperationTemplateParameterImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: OperationTemplateParameterImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -57,6 +57,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OPERATION_TEMPLATE_PARAMETER;
 	}
@@ -114,6 +115,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetParameteredElement(
 			ParameterableElement newParameteredElement, NotificationChain msgs) {
 
@@ -180,6 +182,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -221,6 +224,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OutputPinImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OutputPinImpl.java
index 0257de1..72c3593 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OutputPinImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/OutputPinImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OutputPinImpl.java,v 1.3 2006/05/16 15:07:26 khussey Exp $
+ * $Id: OutputPinImpl.java,v 1.4 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.OUTPUT_PIN;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validateIncomingEdgesStructuredOnly(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return OutputPinOperations.validateIncomingEdgesStructuredOnly(this,
 			diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImpl.java
index 029fc8c..063cfa7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageImpl.java,v 1.32 2006/11/17 15:48:50 khussey Exp $
+ * $Id: PackageImpl.java,v 1.33 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,7 +22,9 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -38,11 +39,16 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedSubsetEObjectEList;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Enumeration;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.PackageMerge;
 import org.eclipse.uml2.uml.PackageableElement;
 import org.eclipse.uml2.uml.ParameterableElement;
@@ -111,7 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -131,7 +137,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList packagedElements = null;
+	protected EList<PackageableElement> packagedElements = null;
 
 	/**
 	 * The cached value of the '{@link #getPackageMerges() <em>Package Merge</em>}' containment reference list.
@@ -141,7 +147,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList packageMerges = null;
+	protected EList<PackageMerge> packageMerges = null;
 
 	/**
 	 * The cached value of the '{@link #getProfileApplications() <em>Profile Application</em>}' containment reference list.
@@ -151,7 +157,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList profileApplications = null;
+	protected EList<ProfileApplication> profileApplications = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -167,6 +173,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PACKAGE;
 	}
@@ -384,23 +391,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PACKAGE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PACKAGE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PACKAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -409,9 +417,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.PACKAGE__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -448,9 +456,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -578,26 +584,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache
-					.put(eResource, this,
+					.put(
+						eResource,
+						this,
 						UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-						ownedMembers = new DerivedUnionEObjectEList(
+						ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 							NamedElement.class, this,
 							UMLPackage.PACKAGE__OWNED_MEMBER,
 							OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.PACKAGE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.PACKAGE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -605,9 +614,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackagedElements() {
+	public EList<PackageableElement> getPackagedElements() {
 		if (packagedElements == null) {
-			packagedElements = new EObjectContainmentEList.Resolving(
+			packagedElements = new EObjectContainmentEList.Resolving<PackageableElement>(
 				PackageableElement.class, this,
 				UMLPackage.PACKAGE__PACKAGED_ELEMENT);
 		}
@@ -643,9 +652,7 @@
 	 */
 	public PackageableElement getPackagedElement(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		packagedElementLoop : for (Iterator i = getPackagedElements()
-			.iterator(); i.hasNext();) {
-			PackageableElement packagedElement = (PackageableElement) i.next();
+		packagedElementLoop : for (PackageableElement packagedElement : getPackagedElements()) {
 			if (eClass != null && !eClass.isInstance(packagedElement))
 				continue packagedElementLoop;
 			if (name != null && !(ignoreCase
@@ -664,9 +671,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackageMerges() {
+	public EList<PackageMerge> getPackageMerges() {
 		if (packageMerges == null) {
-			packageMerges = new EObjectContainmentWithInverseEList.Resolving(
+			packageMerges = new EObjectContainmentWithInverseEList.Resolving<PackageMerge>(
 				PackageMerge.class, this, UMLPackage.PACKAGE__PACKAGE_MERGE,
 				UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
 		}
@@ -704,9 +711,7 @@
 	 */
 	public PackageMerge getPackageMerge(
 			org.eclipse.uml2.uml.Package mergedPackage, boolean createOnDemand) {
-		packageMergeLoop : for (Iterator i = getPackageMerges().iterator(); i
-			.hasNext();) {
-			PackageMerge packageMerge = (PackageMerge) i.next();
+		packageMergeLoop : for (PackageMerge packageMerge : getPackageMerges()) {
 			if (mergedPackage != null
 				&& !mergedPackage.equals(packageMerge.getMergedPackage()))
 				continue packageMergeLoop;
@@ -722,22 +727,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getOwnedTypes() {
+	public EList<Type> getOwnedTypes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedTypes = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Type> ownedTypes = (EList<Type>) cache.get(eResource, this,
 				UMLPackage.Literals.PACKAGE__OWNED_TYPE);
 			if (ownedTypes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.PACKAGE__OWNED_TYPE,
-					ownedTypes = new DerivedSubsetEObjectEList(Type.class,
-						this, UMLPackage.PACKAGE__OWNED_TYPE,
+					ownedTypes = new DerivedSubsetEObjectEList<Type>(
+						Type.class, this, UMLPackage.PACKAGE__OWNED_TYPE,
 						OWNED_TYPE_ESUPERSETS));
 			}
 			return ownedTypes;
 		}
-		return new DerivedSubsetEObjectEList(Type.class, this,
+		return new DerivedSubsetEObjectEList<Type>(Type.class, this,
 			UMLPackage.PACKAGE__OWNED_TYPE, OWNED_TYPE_ESUPERSETS);
 	}
 
@@ -770,9 +776,7 @@
 	 */
 	public Type getOwnedType(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		ownedTypeLoop : for (Iterator i = getOwnedTypes().iterator(); i
-			.hasNext();) {
-			Type ownedType = (Type) i.next();
+		ownedTypeLoop : for (Type ownedType : getOwnedTypes()) {
 			if (eClass != null && !eClass.isInstance(ownedType))
 				continue ownedTypeLoop;
 			if (name != null && !(ignoreCase
@@ -791,23 +795,28 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getNestedPackages() {
+	public EList<org.eclipse.uml2.uml.Package> getNestedPackages() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList nestedPackages = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.PACKAGE__NESTED_PACKAGE);
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Package> nestedPackages = (EList<org.eclipse.uml2.uml.Package>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.PACKAGE__NESTED_PACKAGE);
 			if (nestedPackages == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.PACKAGE__NESTED_PACKAGE,
-					nestedPackages = new DerivedSubsetEObjectEList(
-						org.eclipse.uml2.uml.Package.class, this,
-						UMLPackage.PACKAGE__NESTED_PACKAGE,
-						NESTED_PACKAGE_ESUPERSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.PACKAGE__NESTED_PACKAGE,
+						nestedPackages = new DerivedSubsetEObjectEList<org.eclipse.uml2.uml.Package>(
+							org.eclipse.uml2.uml.Package.class, this,
+							UMLPackage.PACKAGE__NESTED_PACKAGE,
+							NESTED_PACKAGE_ESUPERSETS));
 			}
 			return nestedPackages;
 		}
-		return new DerivedSubsetEObjectEList(
+		return new DerivedSubsetEObjectEList<org.eclipse.uml2.uml.Package>(
 			org.eclipse.uml2.uml.Package.class, this,
 			UMLPackage.PACKAGE__NESTED_PACKAGE, NESTED_PACKAGE_ESUPERSETS);
 	}
@@ -842,10 +851,7 @@
 	 */
 	public org.eclipse.uml2.uml.Package getNestedPackage(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		nestedPackageLoop : for (Iterator i = getNestedPackages().iterator(); i
-			.hasNext();) {
-			org.eclipse.uml2.uml.Package nestedPackage = (org.eclipse.uml2.uml.Package) i
-				.next();
+		nestedPackageLoop : for (org.eclipse.uml2.uml.Package nestedPackage : getNestedPackages()) {
 			if (eClass != null && !eClass.isInstance(nestedPackage))
 				continue nestedPackageLoop;
 			if (name != null && !(ignoreCase
@@ -897,8 +903,8 @@
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newNestingPackage != null)
-				msgs = ((InternalEList) newNestingPackage.getNestedPackages())
-					.basicAdd(this, msgs);
+				msgs = ((InternalEList<org.eclipse.uml2.uml.Package>) newNestingPackage
+					.getNestedPackages()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newNestingPackage,
 				UMLPackage.PACKAGE__NESTING_PACKAGE, msgs);
 			if (msgs != null)
@@ -914,9 +920,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getProfileApplications() {
+	public EList<ProfileApplication> getProfileApplications() {
 		if (profileApplications == null) {
-			profileApplications = new EObjectContainmentWithInverseEList.Resolving(
+			profileApplications = new EObjectContainmentWithInverseEList.Resolving<ProfileApplication>(
 				ProfileApplication.class, this,
 				UMLPackage.PACKAGE__PROFILE_APPLICATION,
 				UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
@@ -958,12 +964,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -990,7 +997,7 @@
 	 * @generated
 	 */
 	public boolean validateElementsPublicOrPrivate(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PackageOperations.validateElementsPublicOrPrivate(this,
 			diagnostics, context);
 	}
@@ -1046,7 +1053,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList applyProfile(Profile profile) {
+	public EList<EObject> applyProfile(Profile profile) {
 		return PackageOperations.applyProfile(this, profile);
 	}
 
@@ -1055,7 +1062,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList unapplyProfile(Profile profile) {
+	public EList<EObject> unapplyProfile(Profile profile) {
 		return PackageOperations.unapplyProfile(this, profile);
 	}
 
@@ -1064,11 +1071,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAppliedProfiles() {
+	public EList<Profile> getAppliedProfiles() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PACKAGE
-				.getEOperations().get(8));
+			@SuppressWarnings("unchecked")
+			EList<Profile> result = (EList<Profile>) cache.get(this,
+				UMLPackage.Literals.PACKAGE.getEOperations().get(8));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PACKAGE.getEOperations()
 					.get(8), result = PackageOperations
@@ -1103,11 +1111,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllProfileApplications() {
+	public EList<ProfileApplication> getAllProfileApplications() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PACKAGE
-				.getEOperations().get(12));
+			@SuppressWarnings("unchecked")
+			EList<ProfileApplication> result = (EList<ProfileApplication>) cache
+				.get(this, UMLPackage.Literals.PACKAGE.getEOperations().get(12));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PACKAGE.getEOperations()
 					.get(12), result = PackageOperations
@@ -1160,11 +1169,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllAppliedProfiles() {
+	public EList<Profile> getAllAppliedProfiles() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PACKAGE
-				.getEOperations().get(9));
+			@SuppressWarnings("unchecked")
+			EList<Profile> result = (EList<Profile>) cache.get(this,
+				UMLPackage.Literals.PACKAGE.getEOperations().get(9));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PACKAGE.getEOperations()
 					.get(9), result = PackageOperations
@@ -1180,11 +1190,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList visibleMembers() {
+	public EList<PackageableElement> visibleMembers() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PACKAGE
-				.getEOperations().get(16));
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this, UMLPackage.Literals.PACKAGE.getEOperations().get(16));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PACKAGE.getEOperations()
 					.get(16), result = PackageOperations.visibleMembers(this));
@@ -1217,24 +1228,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1249,8 +1262,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -1260,11 +1273,11 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return ((InternalEList) getPackageMerges()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return ((InternalEList) getProfileApplications()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1274,47 +1287,48 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PACKAGE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return ((InternalEList) getPackageMerges()).basicRemove(
+				return ((InternalEList<?>) getPackageMerges()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				return ((InternalEList) getPackagedElements()).basicRemove(
+				return ((InternalEList<?>) getPackagedElements()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return ((InternalEList) getProfileApplications()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getProfileApplications())
+					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1324,6 +1338,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -1340,6 +1355,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
@@ -1417,15 +1433,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PACKAGE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PACKAGE__NAME :
 				setName((String) newValue);
@@ -1435,22 +1455,26 @@
 				return;
 			case UMLPackage.PACKAGE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PACKAGE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.PACKAGE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -1460,33 +1484,39 @@
 				return;
 			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
 				return;
 			case UMLPackage.PACKAGE__OWNED_TYPE :
 				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection) newValue);
+				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.PACKAGE__PACKAGE_MERGE :
 				getPackageMerges().clear();
-				getPackageMerges().addAll((Collection) newValue);
+				getPackageMerges().addAll(
+					(Collection<? extends PackageMerge>) newValue);
 				return;
 			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
 				getPackagedElements().clear();
-				getPackagedElements().addAll((Collection) newValue);
+				getPackagedElements().addAll(
+					(Collection<? extends PackageableElement>) newValue);
 				return;
 			case UMLPackage.PACKAGE__NESTED_PACKAGE :
 				getNestedPackages().clear();
-				getNestedPackages().addAll((Collection) newValue);
+				getNestedPackages()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Package>) newValue);
 				return;
 			case UMLPackage.PACKAGE__NESTING_PACKAGE :
 				setNestingPackage((org.eclipse.uml2.uml.Package) newValue);
 				return;
 			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
 				getProfileApplications().clear();
-				getProfileApplications().addAll((Collection) newValue);
+				getProfileApplications().addAll(
+					(Collection<? extends ProfileApplication>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1497,6 +1527,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
@@ -1565,6 +1596,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE__EANNOTATIONS :
@@ -1632,7 +1664,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
@@ -1667,7 +1700,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -1702,6 +1736,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1732,6 +1767,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER);
@@ -1758,6 +1794,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PACKAGE__TEMPLATE_BINDING)
@@ -1814,6 +1851,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.PACKAGE__PACKAGED_ELEMENT);
@@ -1838,6 +1876,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.PACKAGE__NESTING_PACKAGE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImportImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImportImpl.java
index 3d1b8ca..1e6d76c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImportImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageImportImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageImportImpl.java,v 1.14 2006/11/14 18:02:18 khussey Exp $
+ * $Id: PackageImportImpl.java,v 1.15 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.PackageImport;
@@ -109,6 +111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PACKAGE_IMPORT;
 	}
@@ -118,22 +121,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.PACKAGE_IMPORT__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PACKAGE_IMPORT__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PACKAGE_IMPORT__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -142,22 +147,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.PACKAGE_IMPORT__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PACKAGE_IMPORT__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PACKAGE_IMPORT__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -303,7 +310,7 @@
 	 * @generated
 	 */
 	public boolean validatePublicOrPrivate(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PackageImportOperations.validatePublicOrPrivate(this,
 			diagnostics, context);
 	}
@@ -313,12 +320,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -332,14 +341,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
 				return basicSetImportingNamespace(null, msgs);
@@ -352,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -368,6 +379,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
@@ -405,15 +417,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PACKAGE_IMPORT__VISIBILITY :
 				setVisibility((VisibilityKind) newValue);
@@ -433,6 +449,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
@@ -459,6 +476,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
@@ -490,6 +508,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -516,6 +535,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE);
@@ -548,6 +568,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
@@ -572,6 +593,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageMergeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageMergeImpl.java
index f57032f..213a565 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageMergeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageMergeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageMergeImpl.java,v 1.13 2006/11/14 18:02:18 khussey Exp $
+ * $Id: PackageMergeImpl.java,v 1.14 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,6 +32,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.PackageMerge;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -80,6 +82,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PACKAGE_MERGE;
 	}
@@ -89,22 +92,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.PACKAGE_MERGE__TARGET, TARGET_ESUBSETS));
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PACKAGE_MERGE__TARGET,
+						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PACKAGE_MERGE__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -113,22 +118,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
-						UMLPackage.PACKAGE_MERGE__SOURCE, SOURCE_ESUBSETS));
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PACKAGE_MERGE__SOURCE,
+						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PACKAGE_MERGE__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -247,12 +254,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -267,14 +276,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
 				return basicSetReceivingPackage(null, msgs);
@@ -287,6 +297,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -303,6 +314,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
@@ -338,15 +350,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE :
 				setMergedPackage((org.eclipse.uml2.uml.Package) newValue);
@@ -363,6 +379,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
@@ -386,6 +403,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
@@ -425,6 +443,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE);
@@ -457,6 +476,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
@@ -481,6 +501,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageableElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageableElementImpl.java
index 544ce9b..5f84260 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageableElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PackageableElementImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageableElementImpl.java,v 1.14 2006/11/14 18:02:16 khussey Exp $
+ * $Id: PackageableElementImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,6 +16,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -26,6 +27,8 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.PackageableElement;
 import org.eclipse.uml2.uml.ParameterableElement;
@@ -80,6 +83,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PACKAGEABLE_ELEMENT;
 	}
@@ -317,15 +321,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -348,18 +354,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -375,6 +382,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -391,6 +399,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
@@ -436,15 +445,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PACKAGEABLE_ELEMENT__NAME :
 				setName((String) newValue);
@@ -454,7 +467,8 @@
 				return;
 			case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -474,6 +488,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
@@ -509,6 +524,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
@@ -547,7 +563,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -566,7 +583,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -585,6 +603,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -615,6 +634,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterImpl.java
index dc61e02..54720be 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterImpl.java,v 1.33 2006/11/17 15:48:50 khussey Exp $
+ * $Id: ParameterImpl.java,v 1.34 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,6 +37,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.ConnectorEnd;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.MultiplicityElement;
 import org.eclipse.uml2.uml.Namespace;
@@ -175,7 +178,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList parameterSets = null;
+	protected EList<ParameterSet> parameterSets = null;
 
 	/**
 	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
@@ -301,6 +304,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PARAMETER;
 	}
@@ -310,23 +314,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PARAMETER__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.PARAMETER__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -647,9 +653,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getParameterSets() {
+	public EList<ParameterSet> getParameterSets() {
 		if (parameterSets == null) {
-			parameterSets = new EObjectWithInverseResolvingEList.ManyInverse(
+			parameterSets = new EObjectWithInverseResolvingEList.ManyInverse<ParameterSet>(
 				ParameterSet.class, this, UMLPackage.PARAMETER__PARAMETER_SET,
 				UMLPackage.PARAMETER_SET__PARAMETER);
 		}
@@ -671,9 +677,7 @@
 	 * @generated
 	 */
 	public ParameterSet getParameterSet(String name, boolean ignoreCase) {
-		parameterSetLoop : for (Iterator i = getParameterSets().iterator(); i
-			.hasNext();) {
-			ParameterSet parameterSet = (ParameterSet) i.next();
+		parameterSetLoop : for (ParameterSet parameterSet : getParameterSets()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(parameterSet.getName())
 				: name.equals(parameterSet.getName())))
@@ -721,8 +725,8 @@
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newOperation != null)
-				msgs = ((InternalEList) newOperation.getOwnedParameters())
-					.basicAdd(this, msgs);
+				msgs = ((InternalEList<Parameter>) newOperation
+					.getOwnedParameters()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newOperation,
 				UMLPackage.PARAMETER__OPERATION, msgs);
 			if (msgs != null)
@@ -1015,7 +1019,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGt0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGt0(this,
 			diagnostics, context);
 	}
@@ -1025,7 +1030,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateLowerGe0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateLowerGe0(this,
 			diagnostics, context);
 	}
@@ -1035,7 +1041,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGeLower(this,
 			diagnostics, context);
 	}
@@ -1046,7 +1053,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
@@ -1057,7 +1064,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationConstant(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationConstant(this, diagnostics, context);
 	}
@@ -1130,7 +1137,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateConnectorEnd(DiagnosticChain diagnostics, Map context) {
+	public boolean validateConnectorEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ParameterOperations.validateConnectorEnd(this, diagnostics,
 			context);
 	}
@@ -1141,7 +1149,7 @@
 	 * @generated
 	 */
 	public boolean validateStreamAndException(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ParameterOperations.validateStreamAndException(this,
 			diagnostics, context);
 	}
@@ -1151,7 +1159,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotException(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotException(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ParameterOperations.validateNotException(this, diagnostics,
 			context);
 	}
@@ -1162,7 +1171,7 @@
 	 * @generated
 	 */
 	public boolean validateReentrantBehaviors(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ParameterOperations.validateReentrantBehaviors(this,
 			diagnostics, context);
 	}
@@ -1172,7 +1181,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInAndOut(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInAndOut(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ParameterOperations.validateInAndOut(this, diagnostics, context);
 	}
 
@@ -1226,15 +1236,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1249,10 +1261,11 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.PARAMETER__END :
-				return ((InternalEList) getEnds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEnds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return ((InternalEList) getParameterSets()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSets())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1262,18 +1275,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PARAMETER__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
@@ -1281,13 +1295,14 @@
 			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.PARAMETER__END :
-				return ((InternalEList) getEnds()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.PARAMETER__UPPER_VALUE :
 				return basicSetUpperValue(null, msgs);
 			case UMLPackage.PARAMETER__LOWER_VALUE :
 				return basicSetLowerValue(null, msgs);
 			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return ((InternalEList) getParameterSets()).basicRemove(
+				return ((InternalEList<?>) getParameterSets()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETER__DEFAULT_VALUE :
 				return basicSetDefaultValue(null, msgs);
@@ -1300,6 +1315,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
@@ -1395,15 +1411,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PARAMETER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PARAMETER__NAME :
 				setName((String) newValue);
@@ -1413,7 +1433,8 @@
 				return;
 			case UMLPackage.PARAMETER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PARAMETER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -1429,7 +1450,7 @@
 				return;
 			case UMLPackage.PARAMETER__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 			case UMLPackage.PARAMETER__IS_ORDERED :
 				setIsOrdered(((Boolean) newValue).booleanValue());
@@ -1451,7 +1472,8 @@
 				return;
 			case UMLPackage.PARAMETER__PARAMETER_SET :
 				getParameterSets().clear();
-				getParameterSets().addAll((Collection) newValue);
+				getParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.PARAMETER__DIRECTION :
 				setDirection((ParameterDirectionKind) newValue);
@@ -1475,6 +1497,7 @@
 		eDynamicSet(featureID, newValue);
 	}
 
+	@Override
 	public void eDynamicSet(int featureID, Object newValue) {
 
 		if (featureID == UMLPackage.PARAMETER__OPERATION) {
@@ -1490,6 +1513,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
@@ -1570,6 +1594,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER__EANNOTATIONS :
@@ -1640,7 +1665,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.PARAMETER__IS_ORDERED :
@@ -1667,7 +1693,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
@@ -1694,6 +1721,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1737,6 +1765,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PARAMETER__UPPER_VALUE)
@@ -1763,6 +1792,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.PARAMETER__OPERATION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterSetImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterSetImpl.java
index fe84b62..a3d84ff 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterSetImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterSetImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterSetImpl.java,v 1.18 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ParameterSetImpl.java,v 1.19 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,7 +34,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.ParameterSet;
@@ -72,7 +74,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList parameters = null;
+	protected EList<Parameter> parameters = null;
 
 	/**
 	 * The cached value of the '{@link #getConditions() <em>Condition</em>}' containment reference list.
@@ -82,7 +84,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList conditions = null;
+	protected EList<Constraint> conditions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -98,6 +100,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PARAMETER_SET;
 	}
@@ -107,23 +110,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PARAMETER_SET__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.PARAMETER_SET__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PARAMETER_SET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -132,9 +137,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getParameters() {
+	public EList<Parameter> getParameters() {
 		if (parameters == null) {
-			parameters = new EObjectWithInverseResolvingEList.ManyInverse(
+			parameters = new EObjectWithInverseResolvingEList.ManyInverse<Parameter>(
 				Parameter.class, this, UMLPackage.PARAMETER_SET__PARAMETER,
 				UMLPackage.PARAMETER__PARAMETER_SET);
 		}
@@ -156,9 +161,7 @@
 	 * @generated
 	 */
 	public Parameter getParameter(String name, Type type, boolean ignoreCase) {
-		parameterLoop : for (Iterator i = getParameters().iterator(); i
-			.hasNext();) {
-			Parameter parameter = (Parameter) i.next();
+		parameterLoop : for (Parameter parameter : getParameters()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(parameter.getName())
 				: name.equals(parameter.getName())))
@@ -175,9 +178,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConditions() {
+	public EList<Constraint> getConditions() {
 		if (conditions == null) {
-			conditions = new EObjectContainmentEList.Resolving(
+			conditions = new EObjectContainmentEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.PARAMETER_SET__CONDITION);
 		}
 		return conditions;
@@ -221,9 +224,7 @@
 	 */
 	public Constraint getCondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		conditionLoop : for (Iterator i = getConditions().iterator(); i
-			.hasNext();) {
-			Constraint condition = (Constraint) i.next();
+		conditionLoop : for (Constraint condition : getConditions()) {
 			if (eClass != null && !eClass.isInstance(condition))
 				continue conditionLoop;
 			if (name != null && !(ignoreCase
@@ -243,7 +244,7 @@
 	 * @generated
 	 */
 	public boolean validateSameParameterizedEntity(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ParameterSetOperations.validateSameParameterizedEntity(this,
 			diagnostics, context);
 	}
@@ -253,7 +254,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInput(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInput(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ParameterSetOperations.validateInput(this, diagnostics, context);
 	}
 
@@ -263,7 +265,7 @@
 	 * @generated
 	 */
 	public boolean validateTwoParameterSets(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ParameterSetOperations.validateTwoParameterSets(this,
 			diagnostics, context);
 	}
@@ -273,18 +275,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return ((InternalEList) getParameters()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameters())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -294,26 +298,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return ((InternalEList) getParameters()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getParameters()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PARAMETER_SET__CONDITION :
-				return ((InternalEList) getConditions()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getConditions()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -323,6 +328,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
@@ -364,15 +370,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PARAMETER_SET__NAME :
 				setName((String) newValue);
@@ -382,18 +392,21 @@
 				return;
 			case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PARAMETER_SET__PARAMETER :
 				getParameters().clear();
-				getParameters().addAll((Collection) newValue);
+				getParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.PARAMETER_SET__CONDITION :
 				getConditions().clear();
-				getConditions().addAll((Collection) newValue);
+				getConditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -404,6 +417,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
@@ -439,6 +453,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
@@ -490,6 +505,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PARAMETER_SET__CONDITION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterableElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterableElementImpl.java
index e7b5b11..b1526c2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterableElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ParameterableElementImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterableElementImpl.java,v 1.12 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ParameterableElementImpl.java,v 1.13 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,6 +16,7 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -26,6 +27,7 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -76,6 +78,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PARAMETERABLE_ELEMENT;
 	}
@@ -277,12 +280,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -305,14 +310,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
@@ -327,6 +333,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -343,6 +350,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
@@ -372,15 +380,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -397,6 +409,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
@@ -420,6 +433,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
@@ -457,6 +471,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PartDecompositionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PartDecompositionImpl.java
index 86b612d..a7724a5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PartDecompositionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PartDecompositionImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PartDecompositionImpl.java,v 1.2 2005/11/23 20:01:15 khussey Exp $
+ * $Id: PartDecompositionImpl.java,v 1.3 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PART_DECOMPOSITION;
 	}
@@ -60,7 +61,7 @@
 	 * @generated
 	 */
 	public boolean validatePartsOfInternalStructures(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return PartDecompositionOperations.validatePartsOfInternalStructures(
 			this, diagnostics, context);
 	}
@@ -70,7 +71,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAssume(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAssume(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PartDecompositionOperations.validateAssume(this, diagnostics,
 			context);
 	}
@@ -81,7 +83,7 @@
 	 * @generated
 	 */
 	public boolean validateCommutativityOfDecomposition(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return PartDecompositionOperations
 			.validateCommutativityOfDecomposition(this, diagnostics, context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PinImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PinImpl.java
index 5e5d87a..43355b9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PinImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PinImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PinImpl.java,v 1.25 2006/11/14 18:02:19 khussey Exp $
+ * $Id: PinImpl.java,v 1.26 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -23,6 +23,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,11 +37,18 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.MultiplicityElement;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
 import org.eclipse.uml2.uml.Pin;
+import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -190,6 +198,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PIN;
 	}
@@ -199,23 +208,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PIN__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.PIN__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -549,7 +559,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGt0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGt0(this,
 			diagnostics, context);
 	}
@@ -559,7 +570,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateLowerGe0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateLowerGe0(this,
 			diagnostics, context);
 	}
@@ -569,7 +581,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGeLower(this,
 			diagnostics, context);
 	}
@@ -580,7 +593,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
@@ -591,7 +604,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationConstant(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationConstant(this, diagnostics, context);
 	}
@@ -664,7 +677,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateControlPins(DiagnosticChain diagnostics, Map context) {
+	public boolean validateControlPins(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PinOperations.validateControlPins(this, diagnostics, context);
 	}
 
@@ -673,18 +687,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PIN__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PIN__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PIN__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PIN__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PIN__IN_STRUCTURED_NODE :
@@ -692,16 +707,16 @@
 			case UMLPackage.PIN__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.PIN__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PIN__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PIN__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PIN__UPPER_BOUND :
 				return basicSetUpperBound(null, msgs);
@@ -718,6 +733,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PIN__EANNOTATIONS :
@@ -827,15 +843,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PIN__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PIN__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PIN__NAME :
 				setName((String) newValue);
@@ -845,7 +865,8 @@
 				return;
 			case UMLPackage.PIN__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PIN__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -861,23 +882,29 @@
 				return;
 			case UMLPackage.PIN__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.PIN__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.PIN__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.PIN__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.PIN__TYPE :
 				setType((Type) newValue);
@@ -893,7 +920,7 @@
 				return;
 			case UMLPackage.PIN__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.PIN__SELECTION :
 				setSelection((Behavior) newValue);
@@ -928,6 +955,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PIN__EANNOTATIONS :
@@ -1020,6 +1048,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PIN__EANNOTATIONS :
@@ -1103,7 +1132,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.PIN__IS_ORDERED :
@@ -1130,7 +1160,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
@@ -1157,6 +1188,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1190,6 +1222,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PIN__UPPER_VALUE)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PortImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PortImpl.java
index 501ed9e..5ac0efc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PortImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PortImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PortImpl.java,v 1.24 2006/11/17 15:48:50 khussey Exp $
+ * $Id: PortImpl.java,v 1.25 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,13 +36,18 @@
 
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.Deployment;
 import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.ProtocolStateMachine;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
@@ -123,7 +128,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedPorts = null;
+	protected EList<Port> redefinedPorts = null;
 
 	/**
 	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' reference.
@@ -150,6 +155,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PORT;
 	}
@@ -159,25 +165,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.PORT__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.PORT__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
-			UMLPackage.PORT__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this, UMLPackage.PORT__REDEFINED_ELEMENT,
+			REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -239,11 +251,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRequireds() {
+	public EList<Interface> getRequireds() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.PORT__REQUIRED);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PORT__REQUIRED,
@@ -269,8 +282,7 @@
 	 * @generated
 	 */
 	public Interface getRequired(String name, boolean ignoreCase) {
-		requiredLoop : for (Iterator i = getRequireds().iterator(); i.hasNext();) {
-			Interface required = (Interface) i.next();
+		requiredLoop : for (Interface required : getRequireds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(required.getName())
 				: name.equals(required.getName())))
@@ -285,9 +297,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedPorts() {
+	public EList<Port> getRedefinedPorts() {
 		if (redefinedPorts == null) {
-			redefinedPorts = new EObjectResolvingEList(Port.class, this,
+			redefinedPorts = new EObjectResolvingEList<Port>(Port.class, this,
 				UMLPackage.PORT__REDEFINED_PORT);
 		}
 		return redefinedPorts;
@@ -308,9 +320,7 @@
 	 * @generated
 	 */
 	public Port getRedefinedPort(String name, Type type, boolean ignoreCase) {
-		redefinedPortLoop : for (Iterator i = getRedefinedPorts().iterator(); i
-			.hasNext();) {
-			Port redefinedPort = (Port) i.next();
+		redefinedPortLoop : for (Port redefinedPort : getRedefinedPorts()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(redefinedPort.getName())
 				: name.equals(redefinedPort.getName())))
@@ -327,11 +337,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getProvideds() {
+	public EList<Interface> getProvideds() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Interface> result = (EList<Interface>) cache.get(this,
 				UMLPackage.Literals.PORT__PROVIDED);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PORT__PROVIDED,
@@ -357,8 +368,7 @@
 	 * @generated
 	 */
 	public Interface getProvided(String name, boolean ignoreCase) {
-		providedLoop : for (Iterator i = getProvideds().iterator(); i.hasNext();) {
-			Interface provided = (Interface) i.next();
+		providedLoop : for (Interface provided : getProvideds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(provided.getName())
 				: name.equals(provided.getName())))
@@ -416,7 +426,7 @@
 	 * @generated
 	 */
 	public boolean validateRequiredInterfaces(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PortOperations.validateRequiredInterfaces(this, diagnostics,
 			context);
 	}
@@ -427,7 +437,7 @@
 	 * @generated
 	 */
 	public boolean validatePortAggregation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PortOperations.validatePortAggregation(this, diagnostics,
 			context);
 	}
@@ -438,7 +448,7 @@
 	 * @generated
 	 */
 	public boolean validatePortDestroyed(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PortOperations.validatePortDestroyed(this, diagnostics, context);
 	}
 
@@ -447,7 +457,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateDefaultValue(DiagnosticChain diagnostics, Map context) {
+	public boolean validateDefaultValue(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PortOperations.validateDefaultValue(this, diagnostics, context);
 	}
 
@@ -456,6 +467,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PORT__EANNOTATIONS :
@@ -623,15 +635,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PORT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PORT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PORT__NAME :
 				setName((String) newValue);
@@ -641,7 +657,8 @@
 				return;
 			case UMLPackage.PORT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PORT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -684,15 +701,17 @@
 				return;
 			case UMLPackage.PORT__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 			case UMLPackage.PORT__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 			case UMLPackage.PORT__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.PORT__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -717,7 +736,8 @@
 				return;
 			case UMLPackage.PORT__REDEFINED_PROPERTY :
 				getRedefinedProperties().clear();
-				getRedefinedProperties().addAll((Collection) newValue);
+				getRedefinedProperties().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PORT__OWNING_ASSOCIATION :
 				setOwningAssociation((Association) newValue);
@@ -730,14 +750,16 @@
 				return;
 			case UMLPackage.PORT__SUBSETTED_PROPERTY :
 				getSubsettedProperties().clear();
-				getSubsettedProperties().addAll((Collection) newValue);
+				getSubsettedProperties().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PORT__ASSOCIATION :
 				setAssociation((Association) newValue);
 				return;
 			case UMLPackage.PORT__QUALIFIER :
 				getQualifiers().clear();
-				getQualifiers().addAll((Collection) newValue);
+				getQualifiers().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PORT__ASSOCIATION_END :
 				setAssociationEnd((Property) newValue);
@@ -750,7 +772,8 @@
 				return;
 			case UMLPackage.PORT__REDEFINED_PORT :
 				getRedefinedPorts().clear();
-				getRedefinedPorts().addAll((Collection) newValue);
+				getRedefinedPorts().addAll(
+					(Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.PORT__PROTOCOL :
 				setProtocol((ProtocolStateMachine) newValue);
@@ -759,6 +782,7 @@
 		eDynamicSet(featureID, newValue);
 	}
 
+	@Override
 	public void eDynamicSet(int featureID, Object newValue) {
 
 		if (featureID == UMLPackage.PORT__CLASS) {
@@ -774,6 +798,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PORT__EANNOTATIONS :
@@ -905,6 +930,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PORT__EANNOTATIONS :
@@ -1023,6 +1049,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1052,6 +1079,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.PORT__REDEFINED_PORT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PrimitiveTypeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PrimitiveTypeImpl.java
index 545a874..744731c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PrimitiveTypeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PrimitiveTypeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PrimitiveTypeImpl.java,v 1.2 2005/11/23 20:01:20 khussey Exp $
+ * $Id: PrimitiveTypeImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PRIMITIVE_TYPE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileApplicationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileApplicationImpl.java
index 7dc5ff2..1d036d2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileApplicationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileApplicationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProfileApplicationImpl.java,v 1.19 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ProfileApplicationImpl.java,v 1.20 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,6 +19,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.ecore.EPackage;
@@ -34,6 +35,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Profile;
@@ -108,6 +110,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROFILE_APPLICATION;
 	}
@@ -117,24 +120,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache
 					.put(eResource, this,
 						UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-						targets = new DerivedUnionEObjectEList(Element.class,
-							this, UMLPackage.PROFILE_APPLICATION__TARGET,
+						targets = new DerivedUnionEObjectEList<Element>(
+							Element.class, this,
+							UMLPackage.PROFILE_APPLICATION__TARGET,
 							TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROFILE_APPLICATION__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -143,24 +148,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache
 					.put(eResource, this,
 						UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-						sources = new DerivedUnionEObjectEList(Element.class,
-							this, UMLPackage.PROFILE_APPLICATION__SOURCE,
+						sources = new DerivedUnionEObjectEList<Element>(
+							Element.class, this,
+							UMLPackage.PROFILE_APPLICATION__SOURCE,
 							SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROFILE_APPLICATION__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -326,12 +333,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -346,14 +355,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
 				return basicSetApplyingPackage(null, msgs);
@@ -366,6 +376,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -382,6 +393,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
@@ -421,15 +433,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE :
 				setAppliedProfile((Profile) newValue);
@@ -449,6 +465,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
@@ -475,6 +492,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
@@ -506,6 +524,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -532,6 +551,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE);
@@ -564,6 +584,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
@@ -588,6 +609,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileImpl.java
index bb52066..9bdb699 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProfileImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProfileImpl.java,v 1.25 2006/05/08 17:46:11 khussey Exp $
+ * $Id: ProfileImpl.java,v 1.26 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.ecore.EObject;
@@ -38,15 +38,24 @@
 
 import org.eclipse.uml2.common.util.DerivedSubsetEObjectEList;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Extension;
+import org.eclipse.uml2.uml.Model;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.PackageMerge;
 import org.eclipse.uml2.uml.PackageableElement;
 import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.ProfileApplication;
 import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -82,7 +91,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList metaclassReferences = null;
+	protected EList<ElementImport> metaclassReferences = null;
 
 	/**
 	 * The cached value of the '{@link #getMetamodelReferences() <em>Metamodel Reference</em>}' reference list.
@@ -92,7 +101,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList metamodelReferences = null;
+	protected EList<PackageImport> metamodelReferences = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -108,6 +117,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROFILE;
 	}
@@ -117,9 +127,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackagedElements() {
+	public EList<PackageableElement> getPackagedElements() {
 		if (packagedElements == null) {
-			packagedElements = new EObjectContainmentEList.Resolving(
+			packagedElements = new EObjectContainmentEList.Resolving<PackageableElement>(
 				PackageableElement.class, this,
 				UMLPackage.PROFILE__PACKAGED_ELEMENT);
 		}
@@ -131,9 +141,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getElementImports() {
+	public EList<ElementImport> getElementImports() {
 		if (elementImports == null) {
-			elementImports = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			elementImports = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<ElementImport>(
 				ElementImport.class, this, UMLPackage.PROFILE__ELEMENT_IMPORT,
 				null, ELEMENT_IMPORT_ESUBSETS,
 				UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
@@ -156,9 +166,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackageImports() {
+	public EList<PackageImport> getPackageImports() {
 		if (packageImports == null) {
-			packageImports = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			packageImports = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<PackageImport>(
 				PackageImport.class, this, UMLPackage.PROFILE__PACKAGE_IMPORT,
 				null, PACKAGE_IMPORT_ESUBSETS,
 				UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
@@ -211,24 +221,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getOwnedStereotypes() {
+	public EList<Stereotype> getOwnedStereotypes() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedStereotypes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.PROFILE__OWNED_STEREOTYPE);
+			@SuppressWarnings("unchecked")
+			EList<Stereotype> ownedStereotypes = (EList<Stereotype>) cache.get(
+				eResource, this, UMLPackage.Literals.PROFILE__OWNED_STEREOTYPE);
 			if (ownedStereotypes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.PROFILE__OWNED_STEREOTYPE,
-					ownedStereotypes = new DerivedSubsetEObjectEList(
-						Stereotype.class, this,
-						UMLPackage.PROFILE__OWNED_STEREOTYPE,
-						OWNED_STEREOTYPE_ESUPERSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.PROFILE__OWNED_STEREOTYPE,
+						ownedStereotypes = new DerivedSubsetEObjectEList<Stereotype>(
+							Stereotype.class, this,
+							UMLPackage.PROFILE__OWNED_STEREOTYPE,
+							OWNED_STEREOTYPE_ESUPERSETS));
 			}
 			return ownedStereotypes;
 		}
-		return new DerivedSubsetEObjectEList(Stereotype.class, this,
-			UMLPackage.PROFILE__OWNED_STEREOTYPE, OWNED_STEREOTYPE_ESUPERSETS);
+		return new DerivedSubsetEObjectEList<Stereotype>(Stereotype.class,
+			this, UMLPackage.PROFILE__OWNED_STEREOTYPE,
+			OWNED_STEREOTYPE_ESUPERSETS);
 	}
 
 	/**
@@ -260,9 +275,7 @@
 	 */
 	public Stereotype getOwnedStereotype(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedStereotypeLoop : for (Iterator i = getOwnedStereotypes()
-			.iterator(); i.hasNext();) {
-			Stereotype ownedStereotype = (Stereotype) i.next();
+		ownedStereotypeLoop : for (Stereotype ownedStereotype : getOwnedStereotypes()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedStereotype.getName())
 				: name.equals(ownedStereotype.getName())))
@@ -279,9 +292,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMetaclassReferences() {
+	public EList<ElementImport> getMetaclassReferences() {
 		if (metaclassReferences == null) {
-			metaclassReferences = new SubsetSupersetEObjectResolvingEList(
+			metaclassReferences = new SubsetSupersetEObjectResolvingEList<ElementImport>(
 				ElementImport.class, this,
 				UMLPackage.PROFILE__METACLASS_REFERENCE,
 				METACLASS_REFERENCE_ESUPERSETS, null);
@@ -320,9 +333,7 @@
 	 */
 	public ElementImport getMetaclassReference(
 			PackageableElement importedElement, boolean createOnDemand) {
-		metaclassReferenceLoop : for (Iterator i = getMetaclassReferences()
-			.iterator(); i.hasNext();) {
-			ElementImport metaclassReference = (ElementImport) i.next();
+		metaclassReferenceLoop : for (ElementImport metaclassReference : getMetaclassReferences()) {
 			if (importedElement != null
 				&& !importedElement.equals(metaclassReference
 					.getImportedElement()))
@@ -339,9 +350,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMetamodelReferences() {
+	public EList<PackageImport> getMetamodelReferences() {
 		if (metamodelReferences == null) {
-			metamodelReferences = new SubsetSupersetEObjectResolvingEList(
+			metamodelReferences = new SubsetSupersetEObjectResolvingEList<PackageImport>(
 				PackageImport.class, this,
 				UMLPackage.PROFILE__METAMODEL_REFERENCE,
 				METAMODEL_REFERENCE_ESUPERSETS, null);
@@ -380,9 +391,7 @@
 	 */
 	public PackageImport getMetamodelReference(
 			org.eclipse.uml2.uml.Package importedPackage, boolean createOnDemand) {
-		metamodelReferenceLoop : for (Iterator i = getMetamodelReferences()
-			.iterator(); i.hasNext();) {
-			PackageImport metamodelReference = (PackageImport) i.next();
+		metamodelReferenceLoop : for (PackageImport metamodelReference : getMetamodelReferences()) {
 			if (importedPackage != null
 				&& !importedPackage.equals(metamodelReference
 					.getImportedPackage()))
@@ -400,7 +409,7 @@
 	 * @generated
 	 */
 	public boolean validateMetaclassReferenceNotSpecialized(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ProfileOperations.validateMetaclassReferenceNotSpecialized(this,
 			diagnostics, context);
 	}
@@ -411,7 +420,7 @@
 	 * @generated
 	 */
 	public boolean validateReferencesSameMetamodel(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProfileOperations.validateReferencesSameMetamodel(this,
 			diagnostics, context);
 	}
@@ -475,11 +484,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getReferencedMetaclasses() {
+	public EList<org.eclipse.uml2.uml.Class> getReferencedMetaclasses() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PROFILE
-				.getEOperations().get(8));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
+				.get(this, UMLPackage.Literals.PROFILE.getEOperations().get(8));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PROFILE.getEOperations()
 					.get(8), result = ProfileOperations
@@ -495,11 +505,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getReferencedMetamodels() {
+	public EList<Model> getReferencedMetamodels() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PROFILE
-				.getEOperations().get(9));
+			@SuppressWarnings("unchecked")
+			EList<Model> result = (EList<Model>) cache.get(this,
+				UMLPackage.Literals.PROFILE.getEOperations().get(9));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PROFILE.getEOperations()
 					.get(9), result = ProfileOperations
@@ -515,7 +526,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedExtensions(boolean requiredOnly) {
+	public EList<Extension> getOwnedExtensions(boolean requiredOnly) {
 		return ProfileOperations.getOwnedExtensions(this, requiredOnly);
 	}
 
@@ -524,24 +535,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -556,8 +569,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -567,11 +580,11 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return ((InternalEList) getPackageMerges()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return ((InternalEList) getProfileApplications()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -581,47 +594,48 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROFILE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return ((InternalEList) getPackageMerges()).basicRemove(
+				return ((InternalEList<?>) getPackageMerges()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				return ((InternalEList) getPackagedElements()).basicRemove(
+				return ((InternalEList<?>) getPackagedElements()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return ((InternalEList) getProfileApplications()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getProfileApplications())
+					.basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -631,6 +645,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
@@ -714,15 +729,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROFILE__NAME :
 				setName((String) newValue);
@@ -732,22 +751,26 @@
 				return;
 			case UMLPackage.PROFILE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PROFILE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PROFILE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.PROFILE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
 				setOwningTemplateParameter((TemplateParameter) newValue);
@@ -757,45 +780,54 @@
 				return;
 			case UMLPackage.PROFILE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNED_TYPE :
 				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection) newValue);
+				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.PROFILE__PACKAGE_MERGE :
 				getPackageMerges().clear();
-				getPackageMerges().addAll((Collection) newValue);
+				getPackageMerges().addAll(
+					(Collection<? extends PackageMerge>) newValue);
 				return;
 			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
 				getPackagedElements().clear();
-				getPackagedElements().addAll((Collection) newValue);
+				getPackagedElements().addAll(
+					(Collection<? extends PackageableElement>) newValue);
 				return;
 			case UMLPackage.PROFILE__NESTED_PACKAGE :
 				getNestedPackages().clear();
-				getNestedPackages().addAll((Collection) newValue);
+				getNestedPackages()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Package>) newValue);
 				return;
 			case UMLPackage.PROFILE__NESTING_PACKAGE :
 				setNestingPackage((org.eclipse.uml2.uml.Package) newValue);
 				return;
 			case UMLPackage.PROFILE__PROFILE_APPLICATION :
 				getProfileApplications().clear();
-				getProfileApplications().addAll((Collection) newValue);
+				getProfileApplications().addAll(
+					(Collection<? extends ProfileApplication>) newValue);
 				return;
 			case UMLPackage.PROFILE__OWNED_STEREOTYPE :
 				getOwnedStereotypes().clear();
-				getOwnedStereotypes().addAll((Collection) newValue);
+				getOwnedStereotypes().addAll(
+					(Collection<? extends Stereotype>) newValue);
 				return;
 			case UMLPackage.PROFILE__METACLASS_REFERENCE :
 				getMetaclassReferences().clear();
-				getMetaclassReferences().addAll((Collection) newValue);
+				getMetaclassReferences().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.PROFILE__METAMODEL_REFERENCE :
 				getMetamodelReferences().clear();
-				getMetamodelReferences().addAll((Collection) newValue);
+				getMetamodelReferences().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -806,6 +838,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
@@ -883,6 +916,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROFILE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PropertyImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PropertyImpl.java
index faf0648..fbdefb4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PropertyImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PropertyImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PropertyImpl.java,v 1.37 2006/11/17 15:48:50 khussey Exp $
+ * $Id: PropertyImpl.java,v 1.38 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -44,6 +44,7 @@
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
 import org.eclipse.uml2.uml.ConnectableElementTemplateParameter;
 import org.eclipse.uml2.uml.ConnectorEnd;
@@ -135,7 +136,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ends = null;
+	protected EList<ConnectorEnd> ends = null;
 
 	/**
 	 * The cached value of the '{@link #getDeployments() <em>Deployment</em>}' containment reference list.
@@ -145,7 +146,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList deployments = null;
+	protected EList<Deployment> deployments = null;
 
 	/**
 	 * The cached value of the '{@link #getTemplateBindings() <em>Template Binding</em>}' containment reference list.
@@ -155,7 +156,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -265,7 +266,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList redefinedProperties = null;
+	protected EList<Property> redefinedProperties = null;
 
 	/**
 	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
@@ -285,7 +286,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList subsettedProperties = null;
+	protected EList<Property> subsettedProperties = null;
 
 	/**
 	 * The cached value of the '{@link #getQualifiers() <em>Qualifier</em>}' containment reference list.
@@ -295,7 +296,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList qualifiers = null;
+	protected EList<Property> qualifiers = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -311,6 +312,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROPERTY;
 	}
@@ -520,10 +522,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEnds() {
+	public EList<ConnectorEnd> getEnds() {
 		if (ends == null) {
-			ends = new EObjectWithInverseResolvingEList(ConnectorEnd.class,
-				this, UMLPackage.PROPERTY__END, UMLPackage.CONNECTOR_END__ROLE);
+			ends = new EObjectWithInverseResolvingEList<ConnectorEnd>(
+				ConnectorEnd.class, this, UMLPackage.PROPERTY__END,
+				UMLPackage.CONNECTOR_END__ROLE);
 		}
 		return ends;
 	}
@@ -533,23 +536,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PROPERTY__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.PROPERTY__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROPERTY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -558,9 +563,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClientDependencies() {
+	public EList<Dependency> getClientDependencies() {
 		if (clientDependencies == null) {
-			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clientDependencies = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<Dependency>(
 				Dependency.class, this, UMLPackage.PROPERTY__CLIENT_DEPENDENCY,
 				null, CLIENT_DEPENDENCY_ESUBSETS, UMLPackage.DEPENDENCY__CLIENT);
 		}
@@ -572,9 +577,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployments() {
+	public EList<Deployment> getDeployments() {
 		if (deployments == null) {
-			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			deployments = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Deployment>(
 				Deployment.class, this, UMLPackage.PROPERTY__DEPLOYMENT,
 				DEPLOYMENT_ESUPERSETS, null, UMLPackage.DEPLOYMENT__LOCATION);
 		}
@@ -610,9 +615,7 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Iterator i = getDeployments().iterator(); i
-			.hasNext();) {
-			Deployment deployment = (Deployment) i.next();
+		deploymentLoop : for (Deployment deployment : getDeployments()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(deployment.getName())
 				: name.equals(deployment.getName())))
@@ -629,12 +632,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeployedElements() {
+	public EList<PackageableElement> getDeployedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this,
+					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
 			if (result == null) {
 				cache.put(this,
 					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT,
@@ -662,9 +667,7 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (Iterator i = getDeployedElements()
-			.iterator(); i.hasNext();) {
-			PackageableElement deployedElement = (PackageableElement) i.next();
+		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
 			if (name != null && !(ignoreCase
@@ -681,9 +684,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.PROPERTY__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -720,9 +723,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -863,24 +864,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeaturingClassifiers() {
+	public EList<Classifier> getFeaturingClassifiers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList featuringClassifiers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList(
-						Classifier.class, this,
-						UMLPackage.PROPERTY__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
+						featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
+							Classifier.class, this,
+							UMLPackage.PROPERTY__FEATURING_CLASSIFIER,
+							FEATURING_CLASSIFIER_ESUBSETS));
 			}
 			return featuringClassifiers;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.PROPERTY__FEATURING_CLASSIFIER,
 			FEATURING_CLASSIFIER_ESUBSETS);
 	}
@@ -890,24 +896,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.PROPERTY__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.PROPERTY__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.PROPERTY__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -1238,7 +1250,7 @@
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newClass != null)
-				msgs = ((InternalEList) newClass.getOwnedAttributes())
+				msgs = ((InternalEList<Property>) newClass.getOwnedAttributes())
 					.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newClass,
 				UMLPackage.PROPERTY__CLASS, msgs);
@@ -1254,10 +1266,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedProperties() {
+	public EList<Property> getRedefinedProperties() {
 		if (redefinedProperties == null) {
-			redefinedProperties = new EObjectResolvingEList(Property.class,
-				this, UMLPackage.PROPERTY__REDEFINED_PROPERTY);
+			redefinedProperties = new EObjectResolvingEList<Property>(
+				Property.class, this, UMLPackage.PROPERTY__REDEFINED_PROPERTY);
 		}
 		return redefinedProperties;
 	}
@@ -1278,9 +1290,7 @@
 	 */
 	public Property getRedefinedProperty(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		redefinedPropertyLoop : for (Iterator i = getRedefinedProperties()
-			.iterator(); i.hasNext();) {
-			Property redefinedProperty = (Property) i.next();
+		redefinedPropertyLoop : for (Property redefinedProperty : getRedefinedProperties()) {
 			if (eClass != null && !eClass.isInstance(redefinedProperty))
 				continue redefinedPropertyLoop;
 			if (name != null && !(ignoreCase
@@ -1507,10 +1517,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubsettedProperties() {
+	public EList<Property> getSubsettedProperties() {
 		if (subsettedProperties == null) {
-			subsettedProperties = new EObjectResolvingEList(Property.class,
-				this, UMLPackage.PROPERTY__SUBSETTED_PROPERTY);
+			subsettedProperties = new EObjectResolvingEList<Property>(
+				Property.class, this, UMLPackage.PROPERTY__SUBSETTED_PROPERTY);
 		}
 		return subsettedProperties;
 	}
@@ -1531,9 +1541,7 @@
 	 */
 	public Property getSubsettedProperty(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		subsettedPropertyLoop : for (Iterator i = getSubsettedProperties()
-			.iterator(); i.hasNext();) {
-			Property subsettedProperty = (Property) i.next();
+		subsettedPropertyLoop : for (Property subsettedProperty : getSubsettedProperties()) {
 			if (eClass != null && !eClass.isInstance(subsettedProperty))
 				continue subsettedPropertyLoop;
 			if (name != null && !(ignoreCase
@@ -1552,9 +1560,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getQualifiers() {
+	public EList<Property> getQualifiers() {
 		if (qualifiers == null) {
-			qualifiers = new EObjectContainmentWithInverseEList.Resolving(
+			qualifiers = new EObjectContainmentWithInverseEList.Resolving<Property>(
 				Property.class, this, UMLPackage.PROPERTY__QUALIFIER,
 				UMLPackage.PROPERTY__ASSOCIATION_END);
 		}
@@ -1601,9 +1609,7 @@
 	 */
 	public Property getQualifier(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		qualifierLoop : for (Iterator i = getQualifiers().iterator(); i
-			.hasNext();) {
-			Property qualifier = (Property) i.next();
+		qualifierLoop : for (Property qualifier : getQualifiers()) {
 			if (eClass != null && !eClass.isInstance(qualifier))
 				continue qualifierLoop;
 			if (name != null && !(ignoreCase
@@ -1741,12 +1747,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -1773,7 +1780,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfComposite(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateMultiplicityOfComposite(this,
 			diagnostics, context);
 	}
@@ -1784,7 +1791,7 @@
 	 * @generated
 	 */
 	public boolean validateSubsettingContextConforms(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return PropertyOperations.validateSubsettingContextConforms(this,
 			diagnostics, context);
 	}
@@ -1795,7 +1802,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinedPropertyInherited(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return PropertyOperations.validateRedefinedPropertyInherited(this,
 			diagnostics, context);
 	}
@@ -1806,7 +1813,7 @@
 	 * @generated
 	 */
 	public boolean validateSubsettingRules(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateSubsettingRules(this, diagnostics,
 			context);
 	}
@@ -1817,7 +1824,7 @@
 	 * @generated
 	 */
 	public boolean validateNavigableReadonly(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateNavigableReadonly(this, diagnostics,
 			context);
 	}
@@ -1828,7 +1835,7 @@
 	 * @generated
 	 */
 	public boolean validateDerivedUnionIsDerived(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateDerivedUnionIsDerived(this,
 			diagnostics, context);
 	}
@@ -1839,7 +1846,7 @@
 	 * @generated
 	 */
 	public boolean validateDerivedUnionIsReadOnly(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateDerivedUnionIsReadOnly(this,
 			diagnostics, context);
 	}
@@ -1850,7 +1857,7 @@
 	 * @generated
 	 */
 	public boolean validateSubsettedPropertyNames(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateSubsettedPropertyNames(this,
 			diagnostics, context);
 	}
@@ -1861,7 +1868,7 @@
 	 * @generated
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateDeploymentTarget(this, diagnostics,
 			context);
 	}
@@ -1872,7 +1879,7 @@
 	 * @generated
 	 */
 	public boolean validateBindingToAttribute(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PropertyOperations.validateBindingToAttribute(this, diagnostics,
 			context);
 	}
@@ -1954,11 +1961,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList subsettingContext() {
+	public EList<Type> subsettingContext() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.PROPERTY
-				.getEOperations().get(26));
+			@SuppressWarnings("unchecked")
+			EList<Type> result = (EList<Type>) cache.get(this,
+				UMLPackage.Literals.PROPERTY.getEOperations().get(26));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.PROPERTY.getEOperations()
 					.get(26), result = PropertyOperations
@@ -1992,15 +2000,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -2015,13 +2025,14 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.PROPERTY__END :
-				return ((InternalEList) getEnds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEnds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -2045,8 +2056,8 @@
 						msgs);
 				return basicSetAssociation((Association) otherEnd, msgs);
 			case UMLPackage.PROPERTY__QUALIFIER :
-				return ((InternalEList) getQualifiers()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getQualifiers())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROPERTY__ASSOCIATION_END :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -2060,18 +2071,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROPERTY__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROPERTY__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PROPERTY__UPPER_VALUE :
@@ -2083,12 +2095,13 @@
 			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.PROPERTY__END :
-				return ((InternalEList) getEnds()).basicRemove(otherEnd, msgs);
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return ((InternalEList) getDeployments()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
 					msgs);
+			case UMLPackage.PROPERTY__DEPLOYMENT :
+				return ((InternalEList<?>) getDeployments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PROPERTY__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROPERTY__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
@@ -2101,8 +2114,8 @@
 			case UMLPackage.PROPERTY__ASSOCIATION :
 				return basicSetAssociation(null, msgs);
 			case UMLPackage.PROPERTY__QUALIFIER :
-				return ((InternalEList) getQualifiers()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getQualifiers()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PROPERTY__ASSOCIATION_END :
 				return basicSetAssociationEnd(null, msgs);
 		}
@@ -2114,6 +2127,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -2141,6 +2155,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
@@ -2290,15 +2305,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROPERTY__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROPERTY__NAME :
 				setName((String) newValue);
@@ -2308,7 +2327,8 @@
 				return;
 			case UMLPackage.PROPERTY__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PROPERTY__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -2351,15 +2371,17 @@
 				return;
 			case UMLPackage.PROPERTY__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 			case UMLPackage.PROPERTY__DEPLOYMENT :
 				getDeployments().clear();
-				getDeployments().addAll((Collection) newValue);
+				getDeployments().addAll(
+					(Collection<? extends Deployment>) newValue);
 				return;
 			case UMLPackage.PROPERTY__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.PROPERTY__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -2384,7 +2406,8 @@
 				return;
 			case UMLPackage.PROPERTY__REDEFINED_PROPERTY :
 				getRedefinedProperties().clear();
-				getRedefinedProperties().addAll((Collection) newValue);
+				getRedefinedProperties().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
 				setOwningAssociation((Association) newValue);
@@ -2397,14 +2420,16 @@
 				return;
 			case UMLPackage.PROPERTY__SUBSETTED_PROPERTY :
 				getSubsettedProperties().clear();
-				getSubsettedProperties().addAll((Collection) newValue);
+				getSubsettedProperties().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PROPERTY__ASSOCIATION :
 				setAssociation((Association) newValue);
 				return;
 			case UMLPackage.PROPERTY__QUALIFIER :
 				getQualifiers().clear();
-				getQualifiers().addAll((Collection) newValue);
+				getQualifiers().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PROPERTY__ASSOCIATION_END :
 				setAssociationEnd((Property) newValue);
@@ -2413,6 +2438,7 @@
 		eDynamicSet(featureID, newValue);
 	}
 
+	@Override
 	public void eDynamicSet(int featureID, Object newValue) {
 
 		if (featureID == UMLPackage.PROPERTY__CLASS) {
@@ -2428,6 +2454,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
@@ -2547,6 +2574,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROPERTY__EANNOTATIONS :
@@ -2653,7 +2681,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
@@ -2700,7 +2729,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
@@ -2747,6 +2777,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -2787,6 +2818,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER)
@@ -2834,6 +2866,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PROPERTY__DEPLOYMENT)
@@ -2870,6 +2903,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.PROPERTY__CLASS)
 			|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
@@ -2893,6 +2927,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeaturingClassifiers() {
 		return super.isSetFeaturingClassifiers()
 			|| eIsSet(UMLPackage.PROPERTY__CLASS)
@@ -2915,6 +2950,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.PROPERTY__REDEFINED_PROPERTY);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolConformanceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolConformanceImpl.java
index e9834b5..4dffc1b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolConformanceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolConformanceImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolConformanceImpl.java,v 1.13 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ProtocolConformanceImpl.java,v 1.14 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,6 +32,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ProtocolConformance;
 import org.eclipse.uml2.uml.ProtocolStateMachine;
@@ -81,6 +83,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROTOCOL_CONFORMANCE;
 	}
@@ -90,23 +93,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.PROTOCOL_CONFORMANCE__TARGET,
 						TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROTOCOL_CONFORMANCE__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -115,23 +120,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.PROTOCOL_CONFORMANCE__SOURCE,
 						SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROTOCOL_CONFORMANCE__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -248,12 +255,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -268,14 +277,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
 				return basicSetSpecificMachine(null, msgs);
@@ -288,6 +298,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -304,6 +315,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
@@ -339,15 +351,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE :
 				setGeneralMachine((ProtocolStateMachine) newValue);
@@ -364,6 +380,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
@@ -387,6 +404,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
@@ -426,6 +444,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE);
@@ -458,6 +477,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
@@ -482,6 +502,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolStateMachineImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolStateMachineImpl.java
index 5b23f5d..ca7b113 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolStateMachineImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolStateMachineImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolStateMachineImpl.java,v 1.24 2006/11/14 18:02:15 khussey Exp $
+ * $Id: ProtocolStateMachineImpl.java,v 1.25 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,14 +35,38 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.ProtocolConformance;
 import org.eclipse.uml2.uml.ProtocolStateMachine;
+import org.eclipse.uml2.uml.Pseudostate;
+import org.eclipse.uml2.uml.Reception;
+import org.eclipse.uml2.uml.Region;
+import org.eclipse.uml2.uml.State;
+import org.eclipse.uml2.uml.StateMachine;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.ProtocolStateMachineOperations;
@@ -73,7 +97,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList conformances = null;
+	protected EList<ProtocolConformance> conformances = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -89,6 +113,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROTOCOL_STATE_MACHINE;
 	}
@@ -98,23 +123,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -124,9 +151,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConformances() {
+	public EList<ProtocolConformance> getConformances() {
 		if (conformances == null) {
-			conformances = new EObjectContainmentWithInverseEList.Resolving(
+			conformances = new EObjectContainmentWithInverseEList.Resolving<ProtocolConformance>(
 				ProtocolConformance.class, this,
 				UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE,
 				UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
@@ -165,9 +192,7 @@
 	 */
 	public ProtocolConformance getConformance(
 			ProtocolStateMachine generalMachine, boolean createOnDemand) {
-		conformanceLoop : for (Iterator i = getConformances().iterator(); i
-			.hasNext();) {
-			ProtocolConformance conformance = (ProtocolConformance) i.next();
+		conformanceLoop : for (ProtocolConformance conformance : getConformances()) {
 			if (generalMachine != null
 				&& !generalMachine.equals(conformance.getGeneralMachine()))
 				continue conformanceLoop;
@@ -184,7 +209,7 @@
 	 * @generated
 	 */
 	public boolean validateProtocolTransitions(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolStateMachineOperations.validateProtocolTransitions(this,
 			diagnostics, context);
 	}
@@ -194,7 +219,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEntryExitDo(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEntryExitDo(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ProtocolStateMachineOperations.validateEntryExitDo(this,
 			diagnostics, context);
 	}
@@ -205,7 +231,7 @@
 	 * @generated
 	 */
 	public boolean validateDeepOrShallowHistory(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolStateMachineOperations.validateDeepOrShallowHistory(
 			this, diagnostics, context);
 	}
@@ -216,7 +242,7 @@
 	 * @generated
 	 */
 	public boolean validatePortsConnected(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolStateMachineOperations.validatePortsConnected(this,
 			diagnostics, context);
 	}
@@ -227,7 +253,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifierContext(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolStateMachineOperations.validateClassifierContext(this,
 			diagnostics, context);
 	}
@@ -237,24 +263,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -269,8 +297,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -282,22 +310,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
 				if (specification != null)
 					msgs = ((InternalEObject) specification).eInverseRemove(
@@ -305,16 +334,17 @@
 						BehavioralFeature.class, msgs);
 				return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return ((InternalEList) getRegions()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList) getSubmachineStates()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return ((InternalEList) getConformances()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConformances())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -324,105 +354,106 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
-				return ((InternalEList) getPreconditions()).basicRemove(
+				return ((InternalEList<?>) getPreconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
-				return ((InternalEList) getPostconditions()).basicRemove(
+				return ((InternalEList<?>) getPostconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return ((InternalEList) getRegions()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList) getSubmachineStates()).basicRemove(
+				return ((InternalEList<?>) getSubmachineStates()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicRemove(
+				return ((InternalEList<?>) getConnectionPoints()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return ((InternalEList) getConformances()).basicRemove(
+				return ((InternalEList<?>) getConformances()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -433,6 +464,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
@@ -604,15 +636,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME :
 				setName((String) newValue);
@@ -622,22 +658,26 @@
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -653,7 +693,8 @@
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -663,130 +704,156 @@
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
 				getRegions().clear();
-				getRegions().addAll((Collection) newValue);
+				getRegions().addAll((Collection<? extends Region>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
 				getSubmachineStates().clear();
-				getSubmachineStates().addAll((Collection) newValue);
+				getSubmachineStates().addAll(
+					(Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
 				getConnectionPoints().clear();
-				getConnectionPoints().addAll((Collection) newValue);
+				getConnectionPoints().addAll(
+					(Collection<? extends Pseudostate>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE :
 				getExtendedStateMachines().clear();
-				getExtendedStateMachines().addAll((Collection) newValue);
+				getExtendedStateMachines().addAll(
+					(Collection<? extends StateMachine>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
 				getConformances().clear();
-				getConformances().addAll((Collection) newValue);
+				getConformances().addAll(
+					(Collection<? extends ProtocolConformance>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -797,6 +864,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
@@ -955,6 +1023,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
@@ -1128,6 +1197,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolTransitionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolTransitionImpl.java
index 95f4416..5ac0b9e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolTransitionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ProtocolTransitionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolTransitionImpl.java,v 1.32 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ProtocolTransitionImpl.java,v 1.33 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -25,6 +24,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
@@ -41,10 +41,14 @@
 import org.eclipse.uml2.common.util.DerivedEObjectEList;
 
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.CallEvent;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Event;
 import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.ProtocolTransition;
 import org.eclipse.uml2.uml.Region;
@@ -52,6 +56,7 @@
 import org.eclipse.uml2.uml.Transition;
 import org.eclipse.uml2.uml.TransitionKind;
 import org.eclipse.uml2.uml.Trigger;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.Vertex;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -113,6 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PROTOCOL_TRANSITION;
 	}
@@ -122,9 +128,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedRules() {
+	public EList<Constraint> getOwnedRules() {
 		if (ownedRules == null) {
-			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
 				Constraint.class, this,
 				UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE, null,
 				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
@@ -190,7 +196,7 @@
 				setPreCondition(null);
 			}
 			if (newGuard != null) {
-				EList ownedRules = getOwnedRules();
+				EList<Constraint> ownedRules = getOwnedRules();
 				if (!ownedRules.contains(newGuard)) {
 					ownedRules.add(newGuard);
 				}
@@ -243,7 +249,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newPostCondition != null) {
-				EList ownedRules = getOwnedRules();
+				EList<Constraint> ownedRules = getOwnedRules();
 				if (!ownedRules.contains(newPostCondition)) {
 					ownedRules.add(newPostCondition);
 				}
@@ -274,28 +280,32 @@
 	}
 
 	protected static class ReferredEList
-			extends DerivedEObjectEList {
+			extends DerivedEObjectEList<Operation> {
 
-		protected ReferredEList(Class dataClass, InternalEObject owner,
+		protected ReferredEList(Class<?> dataClass, InternalEObject owner,
 				int featureID, int[] sourceFeatureIDs) {
 			super(dataClass, owner, featureID, sourceFeatureIDs);
 		}
 
-		public List basicList() {
+		@Override
+		public List<Operation> basicList() {
 			return new ReferredEList(dataClass, owner, featureID,
 				sourceFeatureIDs) {
 
-				public ListIterator listIterator(int index) {
+				@Override
+				public ListIterator<Operation> listIterator(int index) {
 					return basicListIterator(index);
 				}
 			};
 		}
 
+		@Override
 		protected boolean isIncluded(EStructuralFeature feature) {
 			return false;
 		}
 
-		protected Object derive(Object object) {
+		@Override
+		protected Operation derive(Object object) {
 			Event event = ((Trigger) object).getEvent();
 			return event instanceof CallEvent
 				? ((CallEvent) event).getOperation()
@@ -315,11 +325,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getReferreds() {
+	public EList<Operation> getReferreds() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList referreds = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Operation> referreds = (EList<Operation>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.PROTOCOL_TRANSITION__REFERRED);
 			if (referreds == null) {
 				cache.put(eResource, this,
@@ -335,12 +347,11 @@
 	}
 
 	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getReferred(String name, EList ownedParameterNames,
-			EList ownedParameterTypes) {
+	public Operation getReferred(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes) {
 		return getReferred(name, ownedParameterNames, ownedParameterTypes,
 			false);
 	}
@@ -350,26 +361,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Operation getReferred(String name, EList ownedParameterNames,
-			EList ownedParameterTypes, boolean ignoreCase) {
-		referredLoop : for (Iterator i = getReferreds().iterator(); i.hasNext();) {
-			Operation referred = (Operation) i.next();
+	public Operation getReferred(String name,
+			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
+			boolean ignoreCase) {
+		referredLoop : for (Operation referred : getReferreds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(referred.getName())
 				: name.equals(referred.getName())))
 				continue referredLoop;
-			EList ownedParameterList = referred.getOwnedParameters();
+			EList<Parameter> ownedParameterList = referred.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 			if (ownedParameterNames != null
 				&& ownedParameterNames.size() != ownedParameterListSize
 				|| (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue referredLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 				if (ownedParameterNames != null
 					&& !(ignoreCase
-						? ((String) ownedParameterNames.get(j))
+						? (ownedParameterNames.get(j))
 							.equalsIgnoreCase(ownedParameter.getName())
 						: ownedParameterNames.get(j).equals(
 							ownedParameter.getName())))
@@ -441,7 +451,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateBelongsToPsm(DiagnosticChain diagnostics, Map context) {
+	public boolean validateBelongsToPsm(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ProtocolTransitionOperations.validateBelongsToPsm(this,
 			diagnostics, context);
 	}
@@ -452,7 +463,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociatedActions(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolTransitionOperations.validateAssociatedActions(this,
 			diagnostics, context);
 	}
@@ -463,7 +474,7 @@
 	 * @generated
 	 */
 	public boolean validateRefersToOperation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ProtocolTransitionOperations.validateRefersToOperation(this,
 			diagnostics, context);
 	}
@@ -473,24 +484,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -514,29 +527,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
 				return basicSetContainer(null, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__TARGET :
@@ -544,7 +558,7 @@
 			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
 				return basicSetEffect(null, msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				return ((InternalEList) getTriggers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
 				return basicSetSource(null, msgs);
@@ -557,6 +571,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
@@ -652,15 +667,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__NAME :
 				setName((String) newValue);
@@ -670,22 +689,26 @@
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -710,7 +733,7 @@
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
 				getTriggers().clear();
-				getTriggers().addAll((Collection) newValue);
+				getTriggers().addAll((Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
 				setSource((Vertex) newValue);
@@ -730,6 +753,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
@@ -801,6 +825,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PseudostateImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PseudostateImpl.java
index 102a14a..5eff54e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PseudostateImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/PseudostateImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PseudostateImpl.java,v 1.15 2006/11/14 18:02:16 khussey Exp $
+ * $Id: PseudostateImpl.java,v 1.16 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.Pseudostate;
@@ -36,6 +39,7 @@
 import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StateMachine;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Transition;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -96,6 +100,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.PSEUDOSTATE;
 	}
@@ -270,7 +275,7 @@
 	 * @generated
 	 */
 	public boolean validateInitialVertex(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateInitialVertex(this, diagnostics,
 			context);
 	}
@@ -281,7 +286,7 @@
 	 * @generated
 	 */
 	public boolean validateHistoryVertices(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateHistoryVertices(this, diagnostics,
 			context);
 	}
@@ -291,7 +296,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateJoinVertex(DiagnosticChain diagnostics, Map context) {
+	public boolean validateJoinVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateJoinVertex(this, diagnostics,
 			context);
 	}
@@ -302,7 +308,7 @@
 	 * @generated
 	 */
 	public boolean validateTransitionsIncoming(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateTransitionsIncoming(this,
 			diagnostics, context);
 	}
@@ -312,7 +318,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateForkVertex(DiagnosticChain diagnostics, Map context) {
+	public boolean validateForkVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateForkVertex(this, diagnostics,
 			context);
 	}
@@ -323,7 +330,7 @@
 	 * @generated
 	 */
 	public boolean validateTransitionsOutgoing(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateTransitionsOutgoing(this,
 			diagnostics, context);
 	}
@@ -334,7 +341,7 @@
 	 * @generated
 	 */
 	public boolean validateJunctionVertex(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateJunctionVertex(this, diagnostics,
 			context);
 	}
@@ -344,7 +351,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateChoiceVertex(DiagnosticChain diagnostics, Map context) {
+	public boolean validateChoiceVertex(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateChoiceVertex(this, diagnostics,
 			context);
 	}
@@ -355,7 +363,7 @@
 	 * @generated
 	 */
 	public boolean validateOutgoingFromInitial(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return PseudostateOperations.validateOutgoingFromInitial(this,
 			diagnostics, context);
 	}
@@ -365,20 +373,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__CONTAINER :
 				if (eInternalContainer() != null)
@@ -401,26 +411,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.PSEUDOSTATE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.PSEUDOSTATE__CONTAINER :
 				return basicSetContainer(null, msgs);
 			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
@@ -436,6 +447,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -458,6 +470,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
@@ -513,15 +526,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__NAME :
 				setName((String) newValue);
@@ -531,18 +548,21 @@
 				return;
 			case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.PSEUDOSTATE__CONTAINER :
 				setContainer((Region) newValue);
@@ -565,6 +585,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
@@ -612,6 +633,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
@@ -658,6 +680,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -700,6 +723,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.PSEUDOSTATE__STATE_MACHINE);
@@ -724,6 +748,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || eIsSet(UMLPackage.PSEUDOSTATE__STATE);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/QualifierValueImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/QualifierValueImpl.java
index 22f13bf..733bb31 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/QualifierValueImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/QualifierValueImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: QualifierValueImpl.java,v 1.9 2006/11/14 18:02:17 khussey Exp $
+ * $Id: QualifierValueImpl.java,v 1.10 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,11 +19,13 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.QualifierValue;
@@ -83,6 +85,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.QUALIFIER_VALUE;
 	}
@@ -178,7 +181,7 @@
 	 * @generated
 	 */
 	public boolean validateQualifierAttribute(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return QualifierValueOperations.validateQualifierAttribute(this,
 			diagnostics, context);
 	}
@@ -189,7 +192,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOfQualifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return QualifierValueOperations.validateTypeOfQualifier(this,
 			diagnostics, context);
 	}
@@ -200,7 +203,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return QualifierValueOperations.validateMultiplicityOfQualifier(this,
 			diagnostics, context);
 	}
@@ -210,6 +213,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
@@ -239,15 +243,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.QUALIFIER_VALUE__QUALIFIER :
 				setQualifier((Property) newValue);
@@ -264,6 +272,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
@@ -287,6 +296,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RaiseExceptionActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RaiseExceptionActionImpl.java
index 133767b..01e4d37 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RaiseExceptionActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RaiseExceptionActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RaiseExceptionActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: RaiseExceptionActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -31,7 +32,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.RaiseExceptionAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -81,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RAISE_EXCEPTION_ACTION;
 	}
@@ -90,22 +100,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.RAISE_EXCEPTION_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.RAISE_EXCEPTION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -230,18 +242,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
@@ -249,26 +262,26 @@
 			case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
 				return basicSetException(null, msgs);
 		}
@@ -280,6 +293,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
@@ -363,15 +377,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME :
 				setName((String) newValue);
@@ -381,7 +399,8 @@
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -397,35 +416,44 @@
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
 				setException((InputPin) newValue);
@@ -439,6 +467,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
@@ -504,6 +533,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
@@ -587,6 +617,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadExtentActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadExtentActionImpl.java
index 34790fe..5288cc3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadExtentActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadExtentActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadExtentActionImpl.java,v 1.21 2006/11/14 18:02:17 khussey Exp $
+ * $Id: ReadExtentActionImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadExtentAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -99,6 +108,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_EXTENT_ACTION;
 	}
@@ -108,22 +118,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.READ_EXTENT_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache
+					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+						outputs = new DerivedUnionEObjectEList<OutputPin>(
+							OutputPin.class, this,
+							UMLPackage.READ_EXTENT_ACTION__OUTPUT,
+							OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_EXTENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -278,7 +291,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeIsClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadExtentActionOperations.validateTypeIsClassifier(this,
 			diagnostics, context);
 	}
@@ -289,7 +302,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadExtentActionOperations.validateMultiplicityOfResult(this,
 			diagnostics, context);
 	}
@@ -299,18 +312,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
@@ -318,26 +332,26 @@
 			case UMLPackage.READ_EXTENT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_EXTENT_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -349,6 +363,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
@@ -436,15 +451,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__NAME :
 				setName((String) newValue);
@@ -454,7 +473,8 @@
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -470,35 +490,44 @@
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_EXTENT_ACTION__RESULT :
 				setResult((OutputPin) newValue);
@@ -515,6 +544,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
@@ -583,6 +613,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
@@ -668,6 +699,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_EXTENT_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadIsClassifiedObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadIsClassifiedObjectActionImpl.java
index 6821428..5166813 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadIsClassifiedObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadIsClassifiedObjectActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadIsClassifiedObjectActionImpl.java,v 1.22 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ReadIsClassifiedObjectActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,8 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadIsClassifiedObjectAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -133,6 +142,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION;
 	}
@@ -142,23 +152,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
 						UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT,
 			OUTPUT_ESUBSETS);
 	}
@@ -168,22 +179,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -490,7 +503,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfInput(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadIsClassifiedObjectActionOperations
 			.validateMultiplicityOfInput(this, diagnostics, context);
 	}
@@ -500,7 +513,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadIsClassifiedObjectActionOperations.validateNoType(this,
 			diagnostics, context);
 	}
@@ -511,7 +525,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfOutput(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadIsClassifiedObjectActionOperations
 			.validateMultiplicityOfOutput(this, diagnostics, context);
 	}
@@ -522,7 +536,7 @@
 	 * @generated
 	 */
 	public boolean validateBooleanResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadIsClassifiedObjectActionOperations.validateBooleanResult(
 			this, diagnostics, context);
 	}
@@ -532,18 +546,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -551,26 +566,26 @@
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
@@ -584,6 +599,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
@@ -679,15 +695,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -697,7 +717,8 @@
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -713,35 +734,44 @@
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT :
 				setIsDirect(((Boolean) newValue).booleanValue());
@@ -764,6 +794,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
@@ -838,6 +869,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
@@ -917,6 +949,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -943,6 +976,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT);
@@ -963,6 +997,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkActionImpl.java
index 04ed986..0a20156 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkActionImpl.java,v 1.21 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ReadLinkActionImpl.java,v 1.22 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
+import org.eclipse.uml2.uml.LinkEndData;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadLinkAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -87,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_LINK_ACTION;
 	}
@@ -96,22 +108,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.READ_LINK_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -220,7 +233,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOneOpenEnd(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOneOpenEnd(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkActionOperations.validateOneOpenEnd(this, diagnostics,
 			context);
 	}
@@ -231,7 +245,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkActionOperations.validateTypeAndOrdering(this,
 			diagnostics, context);
 	}
@@ -242,7 +256,7 @@
 	 * @generated
 	 */
 	public boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkActionOperations.validateCompatibleMultiplicity(this,
 			diagnostics, context);
 	}
@@ -253,7 +267,7 @@
 	 * @generated
 	 */
 	public boolean validateNavigableOpenEnd(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkActionOperations.validateNavigableOpenEnd(this,
 			diagnostics, context);
 	}
@@ -263,7 +277,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateVisibility(DiagnosticChain diagnostics, Map context) {
+	public boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkActionOperations.validateVisibility(this, diagnostics,
 			context);
 	}
@@ -273,18 +288,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
@@ -292,32 +308,32 @@
 			case UMLPackage.READ_LINK_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				return ((InternalEList) getEndData()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList) getInputValues()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getInputValues()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -329,6 +345,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
@@ -416,15 +433,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__NAME :
 				setName((String) newValue);
@@ -434,7 +455,8 @@
 				return;
 			case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -450,43 +472,54 @@
 				return;
 			case UMLPackage.READ_LINK_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__END_DATA :
 				getEndData().clear();
-				getEndData().addAll((Collection) newValue);
+				getEndData().addAll(
+					(Collection<? extends LinkEndData>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
 				getInputValues().clear();
-				getInputValues().addAll((Collection) newValue);
+				getInputValues().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.READ_LINK_ACTION__RESULT :
 				setResult((OutputPin) newValue);
@@ -500,6 +533,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
@@ -571,6 +605,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
@@ -658,6 +693,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_LINK_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndActionImpl.java
index 49a176f..ab7ec6a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ReadLinkObjectEndActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.ReadLinkObjectEndAction;
@@ -112,6 +121,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION;
 	}
@@ -121,22 +131,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -145,22 +157,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -435,7 +449,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateProperty(DiagnosticChain diagnostics, Map context) {
+	public boolean validateProperty(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateProperty(this,
 			diagnostics, context);
 	}
@@ -446,7 +461,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationOfAssociation(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations
 			.validateAssociationOfAssociation(this, diagnostics, context);
 	}
@@ -457,7 +472,7 @@
 	 * @generated
 	 */
 	public boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateEndsOfAssociation(
 			this, diagnostics, context);
 	}
@@ -467,7 +482,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTypeOfObject(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTypeOfObject(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateTypeOfObject(this,
 			diagnostics, context);
 	}
@@ -478,7 +494,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateMultiplicityOfObject(
 			this, diagnostics, context);
 	}
@@ -488,7 +504,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTypeOfResult(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateTypeOfResult(this,
 			diagnostics, context);
 	}
@@ -499,7 +516,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndActionOperations.validateMultiplicityOfResult(
 			this, diagnostics, context);
 	}
@@ -509,18 +526,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
@@ -528,26 +546,26 @@
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
@@ -561,6 +579,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
@@ -652,15 +671,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME :
 				setName((String) newValue);
@@ -670,7 +693,8 @@
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -686,35 +710,44 @@
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
 				setObject((InputPin) newValue);
@@ -734,6 +767,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
@@ -805,6 +839,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
@@ -892,6 +927,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT);
@@ -912,6 +948,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndQualifierActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
index dec7137..572f252 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndQualifierActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ReadLinkObjectEndQualifierActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.ReadLinkObjectEndQualifierAction;
@@ -112,6 +121,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION;
 	}
@@ -121,20 +131,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(
+						inputs = new DerivedUnionEObjectEList<InputPin>(
 							InputPin.class,
 							this,
 							UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT,
@@ -142,7 +153,7 @@
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT,
 			INPUT_ESUBSETS);
 	}
@@ -152,20 +163,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ACTION__OUTPUT,
-						outputs = new DerivedUnionEObjectEList(
+						outputs = new DerivedUnionEObjectEList<OutputPin>(
 							OutputPin.class,
 							this,
 							UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT,
@@ -173,7 +185,7 @@
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT,
 			OUTPUT_ESUBSETS);
 	}
@@ -475,7 +487,7 @@
 	 * @generated
 	 */
 	public boolean validateQualifierAttribute(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateQualifierAttribute(this, diagnostics, context);
 	}
@@ -486,7 +498,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationOfAssociation(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateAssociationOfAssociation(this, diagnostics, context);
 	}
@@ -497,7 +509,7 @@
 	 * @generated
 	 */
 	public boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateEndsOfAssociation(this, diagnostics, context);
 	}
@@ -507,7 +519,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateTypeOfObject(DiagnosticChain diagnostics, Map context) {
+	public boolean validateTypeOfObject(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations.validateTypeOfObject(
 			this, diagnostics, context);
 	}
@@ -518,7 +531,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateMultiplicityOfQualifier(this, diagnostics, context);
 	}
@@ -529,7 +542,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateMultiplicityOfObject(this, diagnostics, context);
 	}
@@ -539,7 +552,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations.validateSameType(
 			this, diagnostics, context);
 	}
@@ -550,7 +564,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadLinkObjectEndQualifierActionOperations
 			.validateMultiplicityOfResult(this, diagnostics, context);
 	}
@@ -560,18 +574,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
@@ -579,26 +594,26 @@
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT :
@@ -612,6 +627,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
@@ -703,15 +719,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME :
 				setName((String) newValue);
@@ -721,7 +741,8 @@
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -737,35 +758,44 @@
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
 				setObject((InputPin) newValue);
@@ -785,6 +815,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
@@ -856,6 +887,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
@@ -943,6 +975,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT);
@@ -963,6 +996,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadSelfActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadSelfActionImpl.java
index d337535..5f45cb9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadSelfActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadSelfActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadSelfActionImpl.java,v 1.21 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ReadSelfActionImpl.java,v 1.22 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,14 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadSelfAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -87,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_SELF_ACTION;
 	}
@@ -96,22 +106,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.READ_SELF_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -220,7 +231,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateContained(DiagnosticChain diagnostics, Map context) {
+	public boolean validateContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadSelfActionOperations.validateContained(this, diagnostics,
 			context);
 	}
@@ -230,7 +242,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotStatic(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadSelfActionOperations.validateNotStatic(this, diagnostics,
 			context);
 	}
@@ -240,7 +253,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadSelfActionOperations
 			.validateType(this, diagnostics, context);
 	}
@@ -250,7 +264,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadSelfActionOperations.validateMultiplicity(this, diagnostics,
 			context);
 	}
@@ -260,18 +275,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
@@ -279,26 +295,26 @@
 			case UMLPackage.READ_SELF_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_SELF_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -310,6 +326,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
@@ -393,15 +410,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__NAME :
 				setName((String) newValue);
@@ -411,7 +432,8 @@
 				return;
 			case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -427,35 +449,44 @@
 				return;
 			case UMLPackage.READ_SELF_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_SELF_ACTION__RESULT :
 				setResult((OutputPin) newValue);
@@ -469,6 +500,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
@@ -534,6 +566,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
@@ -617,6 +650,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_SELF_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadStructuralFeatureActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadStructuralFeatureActionImpl.java
index 2991470..3ceac8d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadStructuralFeatureActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadStructuralFeatureActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadStructuralFeatureActionImpl.java,v 1.21 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ReadStructuralFeatureActionImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadStructuralFeatureAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -89,6 +98,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION;
 	}
@@ -98,23 +108,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
 						UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -231,7 +242,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadStructuralFeatureActionOperations.validateTypeAndOrdering(
 			this, diagnostics, context);
 	}
@@ -241,7 +252,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReadStructuralFeatureActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -251,18 +263,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
@@ -270,26 +283,26 @@
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
@@ -303,6 +316,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -394,15 +408,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME :
 				setName((String) newValue);
@@ -412,7 +430,8 @@
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -428,35 +447,44 @@
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
 				setStructuralFeature((StructuralFeature) newValue);
@@ -476,6 +504,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -547,6 +576,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -634,6 +664,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadVariableActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadVariableActionImpl.java
index 69ea49e..7f0e9fa 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadVariableActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReadVariableActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadVariableActionImpl.java,v 1.21 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ReadVariableActionImpl.java,v 1.22 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,14 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReadVariableAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -88,6 +97,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.READ_VARIABLE_ACTION;
 	}
@@ -97,22 +107,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.READ_VARIABLE_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.READ_VARIABLE_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.READ_VARIABLE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -223,7 +235,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadVariableActionOperations.validateTypeAndOrdering(this,
 			diagnostics, context);
 	}
@@ -234,7 +246,7 @@
 	 * @generated
 	 */
 	public boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReadVariableActionOperations.validateCompatibleMultiplicity(
 			this, diagnostics, context);
 	}
@@ -244,18 +256,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
@@ -263,26 +276,26 @@
 			case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 		}
@@ -294,6 +307,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
@@ -381,15 +395,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__NAME :
 				setName((String) newValue);
@@ -399,7 +417,8 @@
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -415,35 +434,44 @@
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.READ_VARIABLE_ACTION__VARIABLE :
 				setVariable((Variable) newValue);
@@ -460,6 +488,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
@@ -528,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
@@ -613,6 +643,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.READ_VARIABLE_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RealizationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RealizationImpl.java
index 7d35b69..b12f15c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RealizationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RealizationImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RealizationImpl.java,v 1.2 2005/11/23 20:01:15 khussey Exp $
+ * $Id: RealizationImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REALIZATION;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveOperationEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveOperationEventImpl.java
index f46c7c0..b187859 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveOperationEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveOperationEventImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReceiveOperationEventImpl.java,v 1.6 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ReceiveOperationEventImpl.java,v 1.7 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.ReceiveOperationEvent;
 import org.eclipse.uml2.uml.StringExpression;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RECEIVE_OPERATION_EVENT;
 	}
@@ -121,6 +125,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_OPERATION_EVENT__EANNOTATIONS :
@@ -170,15 +175,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_OPERATION_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.RECEIVE_OPERATION_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.RECEIVE_OPERATION_EVENT__NAME :
 				setName((String) newValue);
@@ -188,7 +197,8 @@
 				return;
 			case UMLPackage.RECEIVE_OPERATION_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.RECEIVE_OPERATION_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -211,6 +221,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_OPERATION_EVENT__EANNOTATIONS :
@@ -249,6 +260,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_OPERATION_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveSignalEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveSignalEventImpl.java
index 5571433..590f141 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveSignalEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceiveSignalEventImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReceiveSignalEventImpl.java,v 1.6 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ReceiveSignalEventImpl.java,v 1.7 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ReceiveSignalEvent;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.StringExpression;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RECEIVE_SIGNAL_EVENT;
 	}
@@ -120,6 +124,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__EANNOTATIONS :
@@ -169,15 +174,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__NAME :
 				setName((String) newValue);
@@ -187,7 +196,8 @@
 				return;
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -210,6 +220,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__EANNOTATIONS :
@@ -248,6 +259,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEIVE_SIGNAL_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceptionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceptionImpl.java
index 94b01ce..caa03de 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceptionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReceptionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReceptionImpl.java,v 1.12 2006/11/14 18:02:19 khussey Exp $
+ * $Id: ReceptionImpl.java,v 1.13 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,15 +19,25 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.CallConcurrencyKind;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
 import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
 
@@ -74,6 +84,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RECEPTION;
 	}
@@ -125,7 +136,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotQuery(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotQuery(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReceptionOperations.validateNotQuery(this, diagnostics, context);
 	}
 
@@ -134,6 +146,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RECEPTION__EANNOTATIONS :
@@ -215,15 +228,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.RECEPTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.RECEPTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.RECEPTION__NAME :
 				setName((String) newValue);
@@ -233,22 +250,26 @@
 				return;
 			case UMLPackage.RECEPTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.RECEPTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.RECEPTION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.RECEPTION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.RECEPTION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.RECEPTION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -258,25 +279,28 @@
 				return;
 			case UMLPackage.RECEPTION__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.RECEPTION__IS_ABSTRACT :
 				setIsAbstract(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.RECEPTION__METHOD :
 				getMethods().clear();
-				getMethods().addAll((Collection) newValue);
+				getMethods().addAll((Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.RECEPTION__CONCURRENCY :
 				setConcurrency((CallConcurrencyKind) newValue);
 				return;
 			case UMLPackage.RECEPTION__RAISED_EXCEPTION :
 				getRaisedExceptions().clear();
-				getRaisedExceptions().addAll((Collection) newValue);
+				getRaisedExceptions().addAll(
+					(Collection<? extends Type>) newValue);
 				return;
 			case UMLPackage.RECEPTION__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.RECEPTION__SIGNAL :
 				setSignal((Signal) newValue);
@@ -290,6 +314,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEPTION__EANNOTATIONS :
@@ -355,6 +380,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECEPTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReclassifyObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReclassifyObjectActionImpl.java
index 853d540..59d2704 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReclassifyObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReclassifyObjectActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReclassifyObjectActionImpl.java,v 1.22 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ReclassifyObjectActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,8 +37,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ReclassifyObjectAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -97,7 +105,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList oldClassifiers = null;
+	protected EList<Classifier> oldClassifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getNewClassifiers() <em>New Classifier</em>}' reference list.
@@ -107,7 +115,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList newClassifiers = null;
+	protected EList<Classifier> newClassifiers = null;
 
 	/**
 	 * The cached value of the '{@link #getObject() <em>Object</em>}' containment reference.
@@ -133,6 +141,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION;
 	}
@@ -142,22 +151,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -194,9 +205,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOldClassifiers() {
+	public EList<Classifier> getOldClassifiers() {
 		if (oldClassifiers == null) {
-			oldClassifiers = new EObjectResolvingEList(Classifier.class, this,
+			oldClassifiers = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
 				UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER);
 		}
 		return oldClassifiers;
@@ -218,9 +230,7 @@
 	 */
 	public Classifier getOldClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		oldClassifierLoop : for (Iterator i = getOldClassifiers().iterator(); i
-			.hasNext();) {
-			Classifier oldClassifier = (Classifier) i.next();
+		oldClassifierLoop : for (Classifier oldClassifier : getOldClassifiers()) {
 			if (eClass != null && !eClass.isInstance(oldClassifier))
 				continue oldClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -237,9 +247,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNewClassifiers() {
+	public EList<Classifier> getNewClassifiers() {
 		if (newClassifiers == null) {
-			newClassifiers = new EObjectResolvingEList(Classifier.class, this,
+			newClassifiers = new EObjectResolvingEList<Classifier>(
+				Classifier.class, this,
 				UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER);
 		}
 		return newClassifiers;
@@ -261,9 +272,7 @@
 	 */
 	public Classifier getNewClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		newClassifierLoop : for (Iterator i = getNewClassifiers().iterator(); i
-			.hasNext();) {
-			Classifier newClassifier = (Classifier) i.next();
+		newClassifierLoop : for (Classifier newClassifier : getNewClassifiers()) {
 			if (eClass != null && !eClass.isInstance(newClassifier))
 				continue newClassifierLoop;
 			if (name != null && !(ignoreCase
@@ -396,7 +405,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReclassifyObjectActionOperations.validateClassifierNotAbstract(
 			this, diagnostics, context);
 	}
@@ -406,7 +415,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReclassifyObjectActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -416,7 +426,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInputPin(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ReclassifyObjectActionOperations.validateInputPin(this,
 			diagnostics, context);
 	}
@@ -426,18 +437,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -445,26 +457,26 @@
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 		}
@@ -476,6 +488,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
@@ -567,15 +580,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -585,7 +602,8 @@
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -601,46 +619,57 @@
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL :
 				setIsReplaceAll(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER :
 				getOldClassifiers().clear();
-				getOldClassifiers().addAll((Collection) newValue);
+				getOldClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER :
 				getNewClassifiers().clear();
-				getNewClassifiers().addAll((Collection) newValue);
+				getNewClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
 				setObject((InputPin) newValue);
@@ -654,6 +683,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
@@ -728,6 +758,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
@@ -807,6 +838,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -833,6 +865,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableElementImpl.java
index 802c618..383f97b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableElementImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableElementImpl.java,v 1.16 2006/11/14 18:02:17 khussey Exp $
+ * $Id: RedefinableElementImpl.java,v 1.17 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
@@ -32,6 +32,8 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -92,6 +94,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REDEFINABLE_ELEMENT;
 	}
@@ -101,27 +104,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-						redefinedElements = new DerivedUnionEObjectEList(
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
 							RedefinableElement.class, this,
 							UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
 							null));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT, null);
 	}
 
@@ -141,9 +147,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -160,20 +164,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContextsGen() {
+	public EList<Classifier> getRedefinitionContextsGen() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class,
 							this,
 							UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
@@ -181,7 +189,7 @@
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, null);
 	}
 
@@ -191,19 +199,23 @@
 	 */
 	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{UMLPackage.REDEFINABLE_ELEMENT__OWNER};
 
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedEObjectEList(
+						redefinitionContexts = new DerivedEObjectEList<Classifier>(
 							Classifier.class,
 							this,
 							UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
@@ -211,7 +223,7 @@
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedEObjectEList(Classifier.class, this,
+		return new DerivedEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -232,9 +244,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -279,7 +289,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -290,7 +300,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -310,6 +320,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
@@ -355,15 +366,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_ELEMENT__NAME :
 				setName((String) newValue);
@@ -373,7 +388,8 @@
 				return;
 			case UMLPackage.REDEFINABLE_ELEMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -390,6 +406,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
@@ -422,6 +439,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
@@ -471,6 +489,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableTemplateSignatureImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableTemplateSignatureImpl.java
index a666e6f..aaab867 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableTemplateSignatureImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RedefinableTemplateSignatureImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableTemplateSignatureImpl.java,v 1.22 2006/11/17 15:48:50 khussey Exp $
+ * $Id: RedefinableTemplateSignatureImpl.java,v 1.23 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -40,6 +40,8 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.RedefinableTemplateSignature;
@@ -87,7 +89,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList parameters = null;
+	protected EList<TemplateParameter> parameters = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedParameters() <em>Owned Parameter</em>}' containment reference list.
@@ -97,7 +99,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameters = null;
+	protected EList<TemplateParameter> ownedParameters = null;
 
 	/**
 	 * The cached value of the '{@link #getExtendedSignatures() <em>Extended Signature</em>}' reference list.
@@ -107,7 +109,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList extendedSignatures = null;
+	protected EList<RedefinableTemplateSignature> extendedSignatures = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -123,6 +125,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE;
 	}
@@ -132,20 +135,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-						ownedElements = new DerivedUnionEObjectEList(
+						ownedElements = new DerivedUnionEObjectEList<Element>(
 							Element.class,
 							this,
 							UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT,
@@ -153,7 +157,7 @@
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -163,9 +167,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getParameters() {
+	public EList<TemplateParameter> getParameters() {
 		if (parameters == null) {
-			parameters = new SubsetSupersetEObjectResolvingEList(
+			parameters = new SubsetSupersetEObjectResolvingEList<TemplateParameter>(
 				TemplateParameter.class, this,
 				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER, null,
 				PARAMETER_ESUBSETS);
@@ -242,9 +246,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameters() {
+	public EList<TemplateParameter> getOwnedParameters() {
 		if (ownedParameters == null) {
-			ownedParameters = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedParameters = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<TemplateParameter>(
 				TemplateParameter.class, this,
 				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER,
 				OWNED_PARAMETER_ESUPERSETS, null,
@@ -278,20 +282,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-						redefinedElements = new DerivedUnionEObjectEList(
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
 							RedefinableElement.class,
 							this,
 							UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT,
@@ -299,7 +305,8 @@
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -309,20 +316,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinitionContexts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			@SuppressWarnings("unchecked")
+			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
+				.get(
+					eResource,
+					this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 			if (redefinitionContexts == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts = new DerivedUnionEObjectEList(
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(
 							Classifier.class,
 							this,
 							UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT,
@@ -330,7 +341,7 @@
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList(Classifier.class, this,
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
 			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT,
 			REDEFINITION_CONTEXT_ESUBSETS);
 	}
@@ -340,9 +351,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtendedSignatures() {
+	public EList<RedefinableTemplateSignature> getExtendedSignatures() {
 		if (extendedSignatures == null) {
-			extendedSignatures = new EObjectResolvingEList(
+			extendedSignatures = new EObjectResolvingEList<RedefinableTemplateSignature>(
 				RedefinableTemplateSignature.class, this,
 				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE);
 		}
@@ -365,10 +376,7 @@
 	 */
 	public RedefinableTemplateSignature getExtendedSignature(String name,
 			boolean ignoreCase) {
-		extendedSignatureLoop : for (Iterator i = getExtendedSignatures()
-			.iterator(); i.hasNext();) {
-			RedefinableTemplateSignature extendedSignature = (RedefinableTemplateSignature) i
-				.next();
+		extendedSignatureLoop : for (RedefinableTemplateSignature extendedSignature : getExtendedSignatures()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(extendedSignature.getName())
 				: name.equals(extendedSignature.getName())))
@@ -383,11 +391,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInheritedParameters() {
+	public EList<TemplateParameter> getInheritedParameters() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache
+			@SuppressWarnings("unchecked")
+			EList<TemplateParameter> result = (EList<TemplateParameter>) cache
 				.get(
 					this,
 					UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER);
@@ -435,24 +444,7 @@
 	 * @generated NOT
 	 */
 	public void setClassifier(Classifier newClassifier) {
-		if (newClassifier != eInternalContainer()) {
-			if (EcoreUtil.isAncestor(this, newClassifier))
-				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newClassifier != null)
-				msgs = ((InternalEList) newClassifier
-					.getOwnedTemplateSignature()).basicAdd(this, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newClassifier,
-				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER,
-				newClassifier, newClassifier));
+		newClassifier.setOwnedTemplateSignature(this);
 	}
 
 	/**
@@ -460,7 +452,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwnElements(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwnElements(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return TemplateSignatureOperations.validateOwnElements(this,
 			diagnostics, context);
 	}
@@ -471,7 +464,7 @@
 	 * @generated
 	 */
 	public boolean validateInheritedParameters(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableTemplateSignatureOperations
 			.validateInheritedParameters(this, diagnostics, context);
 	}
@@ -491,18 +484,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -516,22 +511,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
 				return basicSetTemplate(null, msgs);
@@ -544,6 +540,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -560,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -621,15 +619,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME :
 				setName((String) newValue);
@@ -639,7 +641,8 @@
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -649,23 +652,28 @@
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
 				getParameters().clear();
-				getParameters().addAll((Collection) newValue);
+				getParameters().addAll(
+					(Collection<? extends TemplateParameter>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends TemplateParameter>) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
 				setTemplate((TemplateableElement) newValue);
 				return;
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE :
 				getExtendedSignatures().clear();
-				getExtendedSignatures().addAll((Collection) newValue);
+				getExtendedSignatures()
+					.addAll(
+						(Collection<? extends RedefinableTemplateSignature>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
 
+	@Override
 	public void eDynamicSet(int featureID, Object newValue) {
 
 		if (featureID == UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER) {
@@ -681,6 +689,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -725,6 +734,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -778,7 +788,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == TemplateSignature.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
@@ -799,7 +810,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == TemplateSignature.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
@@ -879,6 +891,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE);
@@ -899,6 +912,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER);
@@ -909,6 +923,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE);
@@ -939,6 +954,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
 			|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReduceActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReduceActionImpl.java
index 9578f19..5aaf183 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReduceActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReduceActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReduceActionImpl.java,v 1.17 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ReduceActionImpl.java,v 1.18 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -21,6 +21,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,8 +35,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.ReduceAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -132,6 +141,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REDUCE_ACTION;
 	}
@@ -141,23 +151,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
-				cache
-					.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-						outputs = new DerivedUnionEObjectEList(OutputPin.class,
-							this, UMLPackage.REDUCE_ACTION__OUTPUT,
-							OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.REDUCE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.REDUCE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -166,21 +176,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.REDUCE_ACTION__INPUT, INPUT_ESUBSETS));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.REDUCE_ACTION__INPUT,
+						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.REDUCE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -472,7 +484,7 @@
 	 * @generated
 	 */
 	public boolean validateInputTypeIsCollection(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReduceActionOperations.validateInputTypeIsCollection(this,
 			diagnostics, context);
 	}
@@ -483,7 +495,7 @@
 	 * @generated
 	 */
 	public boolean validateOutputTypesAreCompatible(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ReduceActionOperations.validateOutputTypesAreCompatible(this,
 			diagnostics, context);
 	}
@@ -494,7 +506,7 @@
 	 * @generated
 	 */
 	public boolean validateReducerInputsOutput(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReduceActionOperations.validateReducerInputsOutput(this,
 			diagnostics, context);
 	}
@@ -504,18 +516,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
@@ -523,26 +536,26 @@
 			case UMLPackage.REDUCE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REDUCE_ACTION__RESULT :
 				return basicSetResult(null, msgs);
 			case UMLPackage.REDUCE_ACTION__COLLECTION :
@@ -556,6 +569,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
@@ -651,15 +665,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__NAME :
 				setName((String) newValue);
@@ -669,7 +687,8 @@
 				return;
 			case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -685,35 +704,44 @@
 				return;
 			case UMLPackage.REDUCE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REDUCE_ACTION__REDUCER :
 				setReducer((Behavior) newValue);
@@ -736,6 +764,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
@@ -810,6 +839,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
@@ -889,6 +919,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -915,6 +946,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs() || eIsSet(UMLPackage.REDUCE_ACTION__RESULT);
 	}
@@ -934,6 +966,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.REDUCE_ACTION__COLLECTION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RegionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RegionImpl.java
index b215a05..c326100 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RegionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RegionImpl.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RegionImpl.java,v 1.24 2006/11/14 18:02:16 khussey Exp $
+ * $Id: RegionImpl.java,v 1.25 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -24,6 +23,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -40,8 +40,13 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.Region;
 import org.eclipse.uml2.uml.State;
@@ -109,7 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList subvertices = null;
+	protected EList<Vertex> subvertices = null;
 
 	/**
 	 * The cached value of the '{@link #getTransitions() <em>Transition</em>}' containment reference list.
@@ -119,7 +124,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList transitions = null;
+	protected EList<Transition> transitions = null;
 
 	/**
 	 * The cached value of the '{@link #getExtendedRegion() <em>Extended Region</em>}' reference.
@@ -145,6 +150,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REGION;
 	}
@@ -154,24 +160,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.REGION__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.REGION__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.REGION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -191,9 +203,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -210,23 +220,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
-				List redefinitionContexts = redefinitionContext == null
-					? Collections.EMPTY_LIST
+				List<Classifier> redefinitionContexts = redefinitionContext == null
+					? Collections.<Classifier> emptyList()
 					: Collections.singletonList(redefinitionContext);
 				cache
 					.put(
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						result = new EcoreEList.UnmodifiableEList(
+						result = new EcoreEList.UnmodifiableEList<Classifier>(
 							this,
 							UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 							redefinitionContexts.size(), redefinitionContexts
@@ -237,10 +248,10 @@
 		}
 
 		Classifier redefinitionContext = redefinitionContext();
-		List redefinitionContexts = redefinitionContext == null
-			? Collections.EMPTY_LIST
+		List<Classifier> redefinitionContexts = redefinitionContext == null
+			? Collections.<Classifier> emptyList()
 			: Collections.singletonList(redefinitionContext);
-		return new EcoreEList.UnmodifiableEList(this,
+		return new EcoreEList.UnmodifiableEList<Classifier>(this,
 			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 			redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
@@ -261,9 +272,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -316,26 +325,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache
-					.put(eResource, this,
+					.put(
+						eResource,
+						this,
 						UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-						ownedMembers = new DerivedUnionEObjectEList(
+						ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 							NamedElement.class, this,
 							UMLPackage.REGION__OWNED_MEMBER,
 							OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.REGION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.REGION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -343,9 +355,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubvertices() {
+	public EList<Vertex> getSubvertices() {
 		if (subvertices == null) {
-			subvertices = new EObjectContainmentWithInverseEList.Resolving(
+			subvertices = new EObjectContainmentWithInverseEList.Resolving<Vertex>(
 				Vertex.class, this, UMLPackage.REGION__SUBVERTEX,
 				UMLPackage.VERTEX__CONTAINER);
 		}
@@ -381,9 +393,7 @@
 	 */
 	public Vertex getSubvertex(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		subvertexLoop : for (Iterator i = getSubvertices().iterator(); i
-			.hasNext();) {
-			Vertex subvertex = (Vertex) i.next();
+		subvertexLoop : for (Vertex subvertex : getSubvertices()) {
 			if (eClass != null && !eClass.isInstance(subvertex))
 				continue subvertexLoop;
 			if (name != null && !(ignoreCase
@@ -402,9 +412,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTransitions() {
+	public EList<Transition> getTransitions() {
 		if (transitions == null) {
-			transitions = new EObjectContainmentWithInverseEList.Resolving(
+			transitions = new EObjectContainmentWithInverseEList.Resolving<Transition>(
 				Transition.class, this, UMLPackage.REGION__TRANSITION,
 				UMLPackage.TRANSITION__CONTAINER);
 		}
@@ -449,9 +459,7 @@
 	 */
 	public Transition getTransition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		transitionLoop : for (Iterator i = getTransitions().iterator(); i
-			.hasNext();) {
-			Transition transition = (Transition) i.next();
+		transitionLoop : for (Transition transition : getTransitions()) {
 			if (eClass != null && !eClass.isInstance(transition))
 				continue transitionLoop;
 			if (name != null && !(ignoreCase
@@ -640,7 +648,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -651,7 +659,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -685,7 +693,7 @@
 	 * @generated
 	 */
 	public boolean validateInitialVertex(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RegionOperations.validateInitialVertex(this, diagnostics,
 			context);
 	}
@@ -696,7 +704,7 @@
 	 * @generated
 	 */
 	public boolean validateDeepHistoryVertex(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RegionOperations.validateDeepHistoryVertex(this, diagnostics,
 			context);
 	}
@@ -707,7 +715,7 @@
 	 * @generated
 	 */
 	public boolean validateShallowHistoryVertex(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RegionOperations.validateShallowHistoryVertex(this, diagnostics,
 			context);
 	}
@@ -717,7 +725,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return RegionOperations.validateOwned(this, diagnostics, context);
 	}
 
@@ -762,30 +771,32 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__SUBVERTEX :
-				return ((InternalEList) getSubvertices()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubvertices())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__TRANSITION :
-				return ((InternalEList) getTransitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTransitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.REGION__STATE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -803,35 +814,36 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REGION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REGION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REGION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REGION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REGION__SUBVERTEX :
-				return ((InternalEList) getSubvertices()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getSubvertices()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REGION__TRANSITION :
-				return ((InternalEList) getTransitions()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getTransitions()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REGION__STATE :
 				return basicSetState(null, msgs);
 			case UMLPackage.REGION__STATE_MACHINE :
@@ -845,6 +857,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -863,6 +876,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
@@ -936,15 +950,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REGION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REGION__NAME :
 				setName((String) newValue);
@@ -954,33 +972,39 @@
 				return;
 			case UMLPackage.REGION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REGION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.REGION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.REGION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.REGION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REGION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.REGION__SUBVERTEX :
 				getSubvertices().clear();
-				getSubvertices().addAll((Collection) newValue);
+				getSubvertices()
+					.addAll((Collection<? extends Vertex>) newValue);
 				return;
 			case UMLPackage.REGION__TRANSITION :
 				getTransitions().clear();
-				getTransitions().addAll((Collection) newValue);
+				getTransitions().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.REGION__STATE :
 				setState((State) newValue);
@@ -1000,6 +1024,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
@@ -1056,6 +1081,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REGION__EANNOTATIONS :
@@ -1118,7 +1144,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.REGION__IS_LEAF :
@@ -1139,7 +1166,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
@@ -1160,6 +1188,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1219,6 +1248,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.REGION__SUBVERTEX)
@@ -1248,6 +1278,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.REGION__STATE)
 			|| eIsSet(UMLPackage.REGION__STATE_MACHINE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RelationshipImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RelationshipImpl.java
index 03ab085..c6d67ab 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RelationshipImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RelationshipImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RelationshipImpl.java,v 1.11 2006/11/14 18:02:18 khussey Exp $
+ * $Id: RelationshipImpl.java,v 1.12 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -55,6 +55,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.RELATIONSHIP;
 	}
@@ -64,23 +65,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRelatedElements() {
+	public EList<Element> getRelatedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList relatedElements = (EList) cache.get(eResource, this,
+			@SuppressWarnings("unchecked")
+			EList<Element> relatedElements = (EList<Element>) cache.get(
+				eResource, this,
 				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
 			if (relatedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT,
-					relatedElements = new DerivedUnionEObjectEList(
+					relatedElements = new DerivedUnionEObjectEList<Element>(
 						Element.class, this,
 						UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null);
 	}
 
@@ -89,6 +92,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.RELATIONSHIP__EANNOTATIONS :
@@ -112,6 +116,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.RELATIONSHIP__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveStructuralFeatureValueActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveStructuralFeatureValueActionImpl.java
index baa0877..dedc205 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveStructuralFeatureValueActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveStructuralFeatureValueActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveStructuralFeatureValueActionImpl.java,v 1.22 2006/11/14 18:02:17 khussey Exp $
+ * $Id: RemoveStructuralFeatureValueActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.RemoveStructuralFeatureValueAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuralFeature;
@@ -109,6 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION;
 	}
@@ -118,20 +128,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(
+						inputs = new DerivedUnionEObjectEList<InputPin>(
 							InputPin.class,
 							this,
 							UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
@@ -139,7 +150,7 @@
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
 			INPUT_ESUBSETS);
 	}
@@ -307,7 +318,7 @@
 	 * @generated
 	 */
 	public boolean validateNonUniqueRemoval(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RemoveStructuralFeatureValueActionOperations
 			.validateNonUniqueRemoval(this, diagnostics, context);
 	}
@@ -317,18 +328,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
@@ -336,26 +348,26 @@
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
@@ -371,6 +383,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -470,15 +483,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
 				setName((String) newValue);
@@ -488,7 +505,8 @@
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -504,35 +522,44 @@
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
 				setStructuralFeature((StructuralFeature) newValue);
@@ -558,6 +585,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -635,6 +663,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
@@ -716,6 +745,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -745,6 +775,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveVariableValueActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveVariableValueActionImpl.java
index 774ca5b..b7886a4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveVariableValueActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/RemoveVariableValueActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveVariableValueActionImpl.java,v 1.22 2006/11/14 18:02:20 khussey Exp $
+ * $Id: RemoveVariableValueActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.RemoveVariableValueAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -109,6 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION;
 	}
@@ -118,22 +128,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -287,7 +299,7 @@
 	 * @generated
 	 */
 	public boolean validateUnlimitedNatural(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RemoveVariableValueActionOperations.validateUnlimitedNatural(
 			this, diagnostics, context);
 	}
@@ -297,18 +309,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
@@ -316,26 +329,26 @@
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
 				return basicSetValue(null, msgs);
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
@@ -349,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -444,15 +458,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME :
 				setName((String) newValue);
@@ -462,7 +480,8 @@
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -478,35 +497,44 @@
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE :
 				setVariable((Variable) newValue);
@@ -529,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -603,6 +632,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
@@ -682,6 +712,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -710,6 +741,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReplyActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReplyActionImpl.java
index 271129f..9cac69b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReplyActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ReplyActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReplyActionImpl.java,v 1.22 2006/11/14 18:02:20 khussey Exp $
+ * $Id: ReplyActionImpl.java,v 1.23 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ReplyAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -96,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList replyValues = null;
+	protected EList<InputPin> replyValues = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,6 +120,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.REPLY_ACTION;
 	}
@@ -121,21 +130,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
-						UMLPackage.REPLY_ACTION__INPUT, INPUT_ESUBSETS));
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this, UMLPackage.REPLY_ACTION__INPUT,
+						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.REPLY_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -306,10 +317,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getReplyValues() {
+	public EList<InputPin> getReplyValues() {
 		if (replyValues == null) {
-			replyValues = new EObjectContainmentEList.Resolving(InputPin.class,
-				this, UMLPackage.REPLY_ACTION__REPLY_VALUE);
+			replyValues = new EObjectContainmentEList.Resolving<InputPin>(
+				InputPin.class, this, UMLPackage.REPLY_ACTION__REPLY_VALUE);
 		}
 		return replyValues;
 	}
@@ -354,9 +365,7 @@
 	 */
 	public InputPin getReplyValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		replyValueLoop : for (Iterator i = getReplyValues().iterator(); i
-			.hasNext();) {
-			InputPin replyValue = (InputPin) i.next();
+		replyValueLoop : for (InputPin replyValue : getReplyValues()) {
 			if (eClass != null && !eClass.isInstance(replyValue))
 				continue replyValueLoop;
 			if (name != null && !(ignoreCase
@@ -378,7 +387,7 @@
 	 * @generated
 	 */
 	public boolean validatePinsMatchParameter(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ReplyActionOperations.validatePinsMatchParameter(this,
 			diagnostics, context);
 	}
@@ -389,7 +398,7 @@
 	 * @generated
 	 */
 	public boolean validateEventOnReplyToCallTrigger(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return ReplyActionOperations.validateEventOnReplyToCallTrigger(this,
 			diagnostics, context);
 	}
@@ -399,18 +408,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
@@ -418,31 +428,31 @@
 			case UMLPackage.REPLY_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.REPLY_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
 				return basicSetReturnInformation(null, msgs);
 			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				return ((InternalEList) getReplyValues()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getReplyValues()).basicRemove(
+					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -452,6 +462,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
@@ -541,15 +552,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__NAME :
 				setName((String) newValue);
@@ -559,7 +574,8 @@
 				return;
 			case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -575,35 +591,44 @@
 				return;
 			case UMLPackage.REPLY_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.REPLY_ACTION__REPLY_TO_CALL :
 				setReplyToCall((Trigger) newValue);
@@ -613,7 +638,8 @@
 				return;
 			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
 				getReplyValues().clear();
-				getReplyValues().addAll((Collection) newValue);
+				getReplyValues().addAll(
+					(Collection<? extends InputPin>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -624,6 +650,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
@@ -695,6 +722,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
@@ -784,6 +812,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendObjectActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendObjectActionImpl.java
index 8bf3c88..5a5c9da 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendObjectActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendObjectActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendObjectActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: SendObjectActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,6 +19,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,7 +34,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.SendObjectAction;
 import org.eclipse.uml2.uml.StringExpression;
@@ -95,6 +104,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SEND_OBJECT_ACTION;
 	}
@@ -104,21 +114,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -356,18 +368,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
@@ -375,29 +388,29 @@
 			case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
 				return basicSetTarget(null, msgs);
 			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
@@ -411,6 +424,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
@@ -504,15 +518,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__NAME :
 				setName((String) newValue);
@@ -522,7 +540,8 @@
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -538,39 +557,49 @@
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.SEND_OBJECT_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -590,6 +619,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
@@ -664,6 +694,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
@@ -755,6 +786,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.SEND_OBJECT_ACTION__TARGET);
@@ -765,8 +797,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getArguments() {
-		return new EcoreEList.UnmodifiableEList(this,
+	@Override
+	public EList<InputPin> getArguments() {
+		return new EcoreEList.UnmodifiableEList<InputPin>(this,
 			UMLPackage.Literals.INVOCATION_ACTION__ARGUMENT, 0,
 			Collections.EMPTY_LIST.toArray());
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendOperationEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendOperationEventImpl.java
index f8cb9fa..5fffc17 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendOperationEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendOperationEventImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendOperationEventImpl.java,v 1.11 2006/11/14 18:02:19 khussey Exp $
+ * $Id: SendOperationEventImpl.java,v 1.12 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.SendOperationEvent;
 import org.eclipse.uml2.uml.StringExpression;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SEND_OPERATION_EVENT;
 	}
@@ -121,6 +125,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SEND_OPERATION_EVENT__EANNOTATIONS :
@@ -170,15 +175,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SEND_OPERATION_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SEND_OPERATION_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SEND_OPERATION_EVENT__NAME :
 				setName((String) newValue);
@@ -188,7 +197,8 @@
 				return;
 			case UMLPackage.SEND_OPERATION_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SEND_OPERATION_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -211,6 +221,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_OPERATION_EVENT__EANNOTATIONS :
@@ -249,6 +260,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_OPERATION_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalActionImpl.java
index 9bfc95f..6812b3c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendSignalActionImpl.java,v 1.22 2006/11/14 18:02:19 khussey Exp $
+ * $Id: SendSignalActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.SendSignalAction;
 import org.eclipse.uml2.uml.Signal;
@@ -100,6 +109,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SEND_SIGNAL_ACTION;
 	}
@@ -109,21 +119,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -285,7 +297,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNumberOrder(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNumberOrder(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return SendSignalActionOperations.validateNumberOrder(this,
 			diagnostics, context);
 	}
@@ -296,7 +309,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeOrderingMultiplicity(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return SendSignalActionOperations.validateTypeOrderingMultiplicity(
 			this, diagnostics, context);
 	}
@@ -306,18 +319,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
@@ -325,29 +339,29 @@
 			case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				return ((InternalEList) getArguments()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getArguments()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
 				return basicSetTarget(null, msgs);
 		}
@@ -359,6 +373,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
@@ -452,15 +467,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__NAME :
 				setName((String) newValue);
@@ -470,7 +489,8 @@
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -486,39 +506,49 @@
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
 				getArguments().clear();
-				getArguments().addAll((Collection) newValue);
+				getArguments()
+					.addAll((Collection<? extends InputPin>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT :
 				setOnPort((Port) newValue);
@@ -538,6 +568,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
@@ -612,6 +643,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
@@ -703,6 +735,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.SEND_SIGNAL_ACTION__TARGET);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalEventImpl.java
index d07ee53..5150c0c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SendSignalEventImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendSignalEventImpl.java,v 1.11 2006/11/14 18:02:18 khussey Exp $
+ * $Id: SendSignalEventImpl.java,v 1.12 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.SendSignalEvent;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.StringExpression;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SEND_SIGNAL_EVENT;
 	}
@@ -119,6 +123,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_EVENT__EANNOTATIONS :
@@ -168,15 +173,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_EVENT__NAME :
 				setName((String) newValue);
@@ -186,7 +195,8 @@
 				return;
 			case UMLPackage.SEND_SIGNAL_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SEND_SIGNAL_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -209,6 +219,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_EVENT__EANNOTATIONS :
@@ -247,6 +258,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEND_SIGNAL_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SequenceNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SequenceNodeImpl.java
index 5b7d50f..0979ea7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SequenceNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SequenceNodeImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SequenceNodeImpl.java,v 1.19 2006/05/08 17:46:11 khussey Exp $
+ * $Id: SequenceNodeImpl.java,v 1.20 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -25,11 +25,22 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.ExecutableNode;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.SequenceNode;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 /**
@@ -57,7 +68,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList executableNodes = null;
+	protected EList<ExecutableNode> executableNodes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -73,6 +84,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SEQUENCE_NODE;
 	}
@@ -82,9 +94,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExecutableNodes() {
+	public EList<ExecutableNode> getExecutableNodes() {
 		if (executableNodes == null) {
-			executableNodes = new EObjectContainmentEList.Resolving(
+			executableNodes = new EObjectContainmentEList.Resolving<ExecutableNode>(
 				ExecutableNode.class, this,
 				UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE);
 		}
@@ -120,9 +132,7 @@
 	 */
 	public ExecutableNode getExecutableNode(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		executableNodeLoop : for (Iterator i = getExecutableNodes().iterator(); i
-			.hasNext();) {
-			ExecutableNode executableNode = (ExecutableNode) i.next();
+		executableNodeLoop : for (ExecutableNode executableNode : getExecutableNodes()) {
 			if (eClass != null && !eClass.isInstance(executableNode))
 				continue executableNodeLoop;
 			if (name != null && !(ignoreCase
@@ -150,18 +160,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
@@ -169,46 +180,48 @@
 			case UMLPackage.SEQUENCE_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SEQUENCE_NODE__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.SEQUENCE_NODE__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				return ((InternalEList) getExecutableNodes()).basicRemove(
+				return ((InternalEList<?>) getExecutableNodes()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -219,6 +232,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
@@ -336,15 +350,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__NAME :
 				setName((String) newValue);
@@ -354,7 +372,8 @@
 				return;
 			case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -370,69 +389,85 @@
 				return;
 			case UMLPackage.SEQUENCE_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE :
 				setMustIsolate(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.SEQUENCE_NODE__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
 				getExecutableNodes().clear();
-				getExecutableNodes().addAll((Collection) newValue);
+				getExecutableNodes().addAll(
+					(Collection<? extends ExecutableNode>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -443,6 +478,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
@@ -532,6 +568,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
@@ -635,8 +672,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNodes() {
-		return getExecutableNodes();
+	@Override
+	public EList<ActivityNode> getNodes() {
+		@SuppressWarnings("unchecked")
+		EList<ActivityNode> executableNode = (EList<ActivityNode>) ((EList<?>) getExecutableNodes());
+		return executableNode;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalEventImpl.java
index 8e974fd..43bad1b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalEventImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SignalEventImpl.java,v 1.11 2006/11/14 18:02:18 khussey Exp $
+ * $Id: SignalEventImpl.java,v 1.12 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.SignalEvent;
 import org.eclipse.uml2.uml.StringExpression;
@@ -68,6 +71,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SIGNAL_EVENT;
 	}
@@ -119,6 +123,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
@@ -168,15 +173,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SIGNAL_EVENT__NAME :
 				setName((String) newValue);
@@ -186,7 +195,8 @@
 				return;
 			case UMLPackage.SIGNAL_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -209,6 +219,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
@@ -247,6 +258,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalImpl.java
index c9dc34c..2f8ad12 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SignalImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SignalImpl.java,v 1.25 2006/11/14 18:02:20 khussey Exp $
+ * $Id: SignalImpl.java,v 1.26 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -29,15 +29,26 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Signal;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.SignalOperations;
@@ -69,7 +80,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -85,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SIGNAL;
 	}
@@ -94,24 +106,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
-				cache
-					.put(eResource, this,
-						UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-						attributes = new DerivedUnionEObjectEList(
-							Property.class, this, UMLPackage.SIGNAL__ATTRIBUTE,
-							ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this,
+					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this, UMLPackage.SIGNAL__ATTRIBUTE,
+						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.SIGNAL__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -120,26 +132,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache
-					.put(eResource, this,
+					.put(
+						eResource,
+						this,
 						UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-						ownedMembers = new DerivedUnionEObjectEList(
+						ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 							NamedElement.class, this,
 							UMLPackage.SIGNAL__OWNED_MEMBER,
 							OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.SIGNAL__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.SIGNAL__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -147,9 +162,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this, UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
 		}
 		return ownedAttributes;
@@ -195,9 +210,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -229,58 +242,59 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SIGNAL__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.SIGNAL__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.SIGNAL__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SIGNAL__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -291,6 +305,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL__EANNOTATIONS :
@@ -398,15 +413,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SIGNAL__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SIGNAL__NAME :
 				setName((String) newValue);
@@ -416,22 +435,26 @@
 				return;
 			case UMLPackage.SIGNAL__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SIGNAL__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.SIGNAL__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.SIGNAL__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -447,7 +470,8 @@
 				return;
 			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -457,42 +481,50 @@
 				return;
 			case UMLPackage.SIGNAL__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.SIGNAL__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.SIGNAL__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.SIGNAL__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.SIGNAL__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.SIGNAL__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.SIGNAL__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -503,6 +535,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL__EANNOTATIONS :
@@ -592,6 +625,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SIGNAL__EANNOTATIONS :
@@ -694,6 +728,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
@@ -716,6 +751,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SlotImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SlotImpl.java
index 2f2a72f..bf814ca 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SlotImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SlotImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SlotImpl.java,v 1.18 2006/11/14 18:02:17 khussey Exp $
+ * $Id: SlotImpl.java,v 1.19 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,6 +33,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.InstanceSpecification;
 import org.eclipse.uml2.uml.Slot;
@@ -80,7 +81,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList values = null;
+	protected EList<ValueSpecification> values = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -96,6 +97,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SLOT;
 	}
@@ -105,23 +107,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.SLOT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.SLOT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.SLOT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -238,9 +241,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getValues() {
+	public EList<ValueSpecification> getValues() {
 		if (values == null) {
-			values = new EObjectContainmentEList.Resolving(
+			values = new EObjectContainmentEList.Resolving<ValueSpecification>(
 				ValueSpecification.class, this, UMLPackage.SLOT__VALUE);
 		}
 		return values;
@@ -277,8 +280,7 @@
 	 */
 	public ValueSpecification getValue(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		valueLoop : for (Iterator i = getValues().iterator(); i.hasNext();) {
-			ValueSpecification value = (ValueSpecification) i.next();
+		valueLoop : for (ValueSpecification value : getValues()) {
 			if (eClass != null && !eClass.isInstance(value))
 				continue valueLoop;
 			if (name != null && !(ignoreCase
@@ -299,12 +301,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.SLOT__OWNING_INSTANCE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -319,18 +323,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SLOT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SLOT__VALUE :
-				return ((InternalEList) getValues())
-					.basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getValues()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.SLOT__OWNING_INSTANCE :
 				return basicSetOwningInstance(null, msgs);
 		}
@@ -342,6 +347,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -358,6 +364,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
@@ -389,22 +396,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SLOT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SLOT__DEFINING_FEATURE :
 				setDefiningFeature((StructuralFeature) newValue);
 				return;
 			case UMLPackage.SLOT__VALUE :
 				getValues().clear();
-				getValues().addAll((Collection) newValue);
+				getValues().addAll(
+					(Collection<? extends ValueSpecification>) newValue);
 				return;
 			case UMLPackage.SLOT__OWNING_INSTANCE :
 				setOwningInstance((InstanceSpecification) newValue);
@@ -418,6 +430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
@@ -444,6 +457,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SLOT__EANNOTATIONS :
@@ -506,6 +520,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || eIsSet(UMLPackage.SLOT__OWNING_INSTANCE);
 	}
@@ -515,6 +530,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements() || eIsSet(UMLPackage.SLOT__VALUE);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StartClassifierBehaviorActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StartClassifierBehaviorActionImpl.java
index d72f56b..bf020cd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StartClassifierBehaviorActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StartClassifierBehaviorActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StartClassifierBehaviorActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: StartClassifierBehaviorActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StartClassifierBehaviorAction;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -87,6 +96,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION;
 	}
@@ -96,22 +106,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -236,7 +248,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StartClassifierBehaviorActionOperations.validateMultiplicity(
 			this, diagnostics, context);
 	}
@@ -247,7 +260,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeHasClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StartClassifierBehaviorActionOperations
 			.validateTypeHasClassifier(this, diagnostics, context);
 	}
@@ -257,18 +270,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
@@ -276,26 +290,26 @@
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 		}
@@ -307,6 +321,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
@@ -390,15 +405,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME :
 				setName((String) newValue);
@@ -408,7 +427,8 @@
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -424,35 +444,44 @@
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
 				setObject((InputPin) newValue);
@@ -466,6 +495,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
@@ -531,6 +561,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
@@ -614,6 +645,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateImpl.java
index f641790..bc4e4cb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateImpl.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateImpl.java,v 1.29 2006/11/14 18:02:20 khussey Exp $
+ * $Id: StateImpl.java,v 1.30 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -24,6 +23,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -43,11 +43,15 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectionPointReference;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Pseudostate;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.Region;
@@ -130,7 +134,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList outgoings = null;
+	protected EList<Transition> outgoings = null;
 
 	/**
 	 * The cached value of the '{@link #getIncomings() <em>Incoming</em>}' reference list.
@@ -140,7 +144,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList incomings = null;
+	protected EList<Transition> incomings = null;
 
 	/**
 	 * The default value of the '{@link #isComposite() <em>Is Composite</em>}' attribute.
@@ -200,7 +204,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList connections = null;
+	protected EList<ConnectionPointReference> connections = null;
 
 	/**
 	 * The cached value of the '{@link #getConnectionPoints() <em>Connection Point</em>}' containment reference list.
@@ -210,7 +214,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList connectionPoints = null;
+	protected EList<Pseudostate> connectionPoints = null;
 
 	/**
 	 * The cached value of the '{@link #getRedefinedState() <em>Redefined State</em>}' reference.
@@ -270,7 +274,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList deferrableTriggers = null;
+	protected EList<Trigger> deferrableTriggers = null;
 
 	/**
 	 * The cached value of the '{@link #getRegions() <em>Region</em>}' containment reference list.
@@ -280,7 +284,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList regions = null;
+	protected EList<Region> regions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -296,6 +300,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STATE;
 	}
@@ -305,24 +310,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.STATE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.STATE__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.STATE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
@@ -342,9 +353,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -361,23 +370,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
-				List redefinitionContexts = redefinitionContext == null
-					? Collections.EMPTY_LIST
+				List<Classifier> redefinitionContexts = redefinitionContext == null
+					? Collections.<Classifier> emptyList()
 					: Collections.singletonList(redefinitionContext);
 				cache
 					.put(
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						result = new EcoreEList.UnmodifiableEList(
+						result = new EcoreEList.UnmodifiableEList<Classifier>(
 							this,
 							UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 							redefinitionContexts.size(), redefinitionContexts
@@ -388,10 +398,10 @@
 		}
 
 		Classifier redefinitionContext = redefinitionContext();
-		List redefinitionContexts = redefinitionContext == null
-			? Collections.EMPTY_LIST
+		List<Classifier> redefinitionContexts = redefinitionContext == null
+			? Collections.<Classifier> emptyList()
 			: Collections.singletonList(redefinitionContext);
-		return new EcoreEList.UnmodifiableEList(this,
+		return new EcoreEList.UnmodifiableEList<Classifier>(this,
 			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 			redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
@@ -412,9 +422,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -479,10 +487,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutgoings() {
+	public EList<Transition> getOutgoings() {
 		if (outgoings == null) {
-			outgoings = new EObjectWithInverseResolvingEList(Transition.class,
-				this, UMLPackage.STATE__OUTGOING, UMLPackage.TRANSITION__SOURCE);
+			outgoings = new EObjectWithInverseResolvingEList<Transition>(
+				Transition.class, this, UMLPackage.STATE__OUTGOING,
+				UMLPackage.TRANSITION__SOURCE);
 		}
 		return outgoings;
 	}
@@ -502,8 +511,7 @@
 	 * @generated
 	 */
 	public Transition getOutgoing(String name, boolean ignoreCase, EClass eClass) {
-		outgoingLoop : for (Iterator i = getOutgoings().iterator(); i.hasNext();) {
-			Transition outgoing = (Transition) i.next();
+		outgoingLoop : for (Transition outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
 			if (name != null && !(ignoreCase
@@ -520,10 +528,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getIncomings() {
+	public EList<Transition> getIncomings() {
 		if (incomings == null) {
-			incomings = new EObjectWithInverseResolvingEList(Transition.class,
-				this, UMLPackage.STATE__INCOMING, UMLPackage.TRANSITION__TARGET);
+			incomings = new EObjectWithInverseResolvingEList<Transition>(
+				Transition.class, this, UMLPackage.STATE__INCOMING,
+				UMLPackage.TRANSITION__TARGET);
 		}
 		return incomings;
 	}
@@ -543,8 +552,7 @@
 	 * @generated
 	 */
 	public Transition getIncoming(String name, boolean ignoreCase, EClass eClass) {
-		incomingLoop : for (Iterator i = getIncomings().iterator(); i.hasNext();) {
-			Transition incoming = (Transition) i.next();
+		incomingLoop : for (Transition incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
 			if (name != null && !(ignoreCase
@@ -623,24 +631,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -648,23 +657,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.STATE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this, UMLPackage.STATE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.STATE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -788,9 +798,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConnections() {
+	public EList<ConnectionPointReference> getConnections() {
 		if (connections == null) {
-			connections = new EObjectContainmentWithInverseEList.Resolving(
+			connections = new EObjectContainmentWithInverseEList.Resolving<ConnectionPointReference>(
 				ConnectionPointReference.class, this,
 				UMLPackage.STATE__CONNECTION,
 				UMLPackage.CONNECTION_POINT_REFERENCE__STATE);
@@ -827,10 +837,7 @@
 	 */
 	public ConnectionPointReference getConnection(String name,
 			boolean ignoreCase, boolean createOnDemand) {
-		connectionLoop : for (Iterator i = getConnections().iterator(); i
-			.hasNext();) {
-			ConnectionPointReference connection = (ConnectionPointReference) i
-				.next();
+		connectionLoop : for (ConnectionPointReference connection : getConnections()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(connection.getName())
 				: name.equals(connection.getName())))
@@ -847,9 +854,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConnectionPoints() {
+	public EList<Pseudostate> getConnectionPoints() {
 		if (connectionPoints == null) {
-			connectionPoints = new EObjectContainmentWithInverseEList.Resolving(
+			connectionPoints = new EObjectContainmentWithInverseEList.Resolving<Pseudostate>(
 				Pseudostate.class, this, UMLPackage.STATE__CONNECTION_POINT,
 				UMLPackage.PSEUDOSTATE__STATE);
 		}
@@ -885,9 +892,7 @@
 	 */
 	public Pseudostate getConnectionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		connectionPointLoop : for (Iterator i = getConnectionPoints()
-			.iterator(); i.hasNext();) {
-			Pseudostate connectionPoint = (Pseudostate) i.next();
+		connectionPointLoop : for (Pseudostate connectionPoint : getConnectionPoints()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(connectionPoint.getName())
 				: name.equals(connectionPoint.getName())))
@@ -1352,9 +1357,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getDeferrableTriggers() {
+	public EList<Trigger> getDeferrableTriggers() {
 		if (deferrableTriggers == null) {
-			deferrableTriggers = new EObjectContainmentEList.Resolving(
+			deferrableTriggers = new EObjectContainmentEList.Resolving<Trigger>(
 				Trigger.class, this, UMLPackage.STATE__DEFERRABLE_TRIGGER);
 		}
 		return deferrableTriggers;
@@ -1389,9 +1394,7 @@
 	 */
 	public Trigger getDeferrableTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deferrableTriggerLoop : for (Iterator i = getDeferrableTriggers()
-			.iterator(); i.hasNext();) {
-			Trigger deferrableTrigger = (Trigger) i.next();
+		deferrableTriggerLoop : for (Trigger deferrableTrigger : getDeferrableTriggers()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(deferrableTrigger.getName())
 				: name.equals(deferrableTrigger.getName())))
@@ -1408,9 +1411,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRegions() {
+	public EList<Region> getRegions() {
 		if (regions == null) {
-			regions = new EObjectContainmentWithInverseEList.Resolving(
+			regions = new EObjectContainmentWithInverseEList.Resolving<Region>(
 				Region.class, this, UMLPackage.STATE__REGION,
 				UMLPackage.REGION__STATE);
 		}
@@ -1446,8 +1449,7 @@
 	 */
 	public Region getRegion(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		regionLoop : for (Iterator i = getRegions().iterator(); i.hasNext();) {
-			Region region = (Region) i.next();
+		regionLoop : for (Region region : getRegions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(region.getName())
 				: name.equals(region.getName())))
@@ -1465,7 +1467,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -1476,7 +1478,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -1510,7 +1512,7 @@
 	 * @generated
 	 */
 	public boolean validateSubmachineStates(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateOperations.validateSubmachineStates(this, diagnostics,
 			context);
 	}
@@ -1521,7 +1523,7 @@
 	 * @generated
 	 */
 	public boolean validateDestinationsOrSourcesOfTransitions(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return StateOperations.validateDestinationsOrSourcesOfTransitions(this,
 			diagnostics, context);
 	}
@@ -1532,7 +1534,7 @@
 	 * @generated
 	 */
 	public boolean validateSubmachineOrRegions(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateOperations.validateSubmachineOrRegions(this, diagnostics,
 			context);
 	}
@@ -1543,7 +1545,7 @@
 	 * @generated
 	 */
 	public boolean validateCompositeStates(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateOperations.validateCompositeStates(this, diagnostics,
 			context);
 	}
@@ -1553,7 +1555,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEntryOrExit(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEntryOrExit(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StateOperations.validateEntryOrExit(this, diagnostics, context);
 	}
 
@@ -1589,29 +1592,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__CONTAINER :
 				if (eInternalContainer() != null)
@@ -1624,13 +1629,14 @@
 						StateMachine.class, msgs);
 				return basicSetSubmachine((StateMachine) otherEnd, msgs);
 			case UMLPackage.STATE__CONNECTION :
-				return ((InternalEList) getConnections()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnections())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE__REGION :
-				return ((InternalEList) getRegions()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1640,44 +1646,45 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STATE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STATE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STATE__CONTAINER :
 				return basicSetContainer(null, msgs);
 			case UMLPackage.STATE__SUBMACHINE :
 				return basicSetSubmachine(null, msgs);
 			case UMLPackage.STATE__CONNECTION :
-				return ((InternalEList) getConnections()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getConnections()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STATE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicRemove(
+				return ((InternalEList<?>) getConnectionPoints()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE__STATE_INVARIANT :
 				return basicSetStateInvariant(null, msgs);
@@ -1688,10 +1695,10 @@
 			case UMLPackage.STATE__DO_ACTIVITY :
 				return basicSetDoActivity(null, msgs);
 			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				return ((InternalEList) getDeferrableTriggers()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getDeferrableTriggers())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE__REGION :
-				return ((InternalEList) getRegions()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -1702,6 +1709,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -1717,6 +1725,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
@@ -1830,15 +1839,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STATE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STATE__NAME :
 				setName((String) newValue);
@@ -1848,33 +1861,39 @@
 				return;
 			case UMLPackage.STATE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STATE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.STATE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.STATE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.STATE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STATE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.STATE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.STATE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.STATE__CONTAINER :
 				setContainer((Region) newValue);
@@ -1884,11 +1903,13 @@
 				return;
 			case UMLPackage.STATE__CONNECTION :
 				getConnections().clear();
-				getConnections().addAll((Collection) newValue);
+				getConnections().addAll(
+					(Collection<? extends ConnectionPointReference>) newValue);
 				return;
 			case UMLPackage.STATE__CONNECTION_POINT :
 				getConnectionPoints().clear();
-				getConnectionPoints().addAll((Collection) newValue);
+				getConnectionPoints().addAll(
+					(Collection<? extends Pseudostate>) newValue);
 				return;
 			case UMLPackage.STATE__REDEFINED_STATE :
 				setRedefinedState((State) newValue);
@@ -1907,11 +1928,12 @@
 				return;
 			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
 				getDeferrableTriggers().clear();
-				getDeferrableTriggers().addAll((Collection) newValue);
+				getDeferrableTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.STATE__REGION :
 				getRegions().clear();
-				getRegions().addAll((Collection) newValue);
+				getRegions().addAll((Collection<? extends Region>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1922,6 +1944,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
@@ -2002,6 +2025,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE__EANNOTATIONS :
@@ -2089,7 +2113,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.STATE__IS_LEAF :
@@ -2122,7 +2147,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
@@ -2155,6 +2181,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -2204,6 +2231,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.STATE__CONTAINER);
 	}
@@ -2225,6 +2253,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.STATE__CONNECTION)
@@ -2251,6 +2280,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.STATE__CONNECTION_POINT)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateInvariantImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateInvariantImpl.java
index c09faf5..712de7c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateInvariantImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateInvariantImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateInvariantImpl.java,v 1.21 2006/11/14 18:02:18 khussey Exp $
+ * $Id: StateInvariantImpl.java,v 1.22 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,8 +32,11 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.GeneralOrdering;
 import org.eclipse.uml2.uml.Interaction;
 import org.eclipse.uml2.uml.InteractionOperand;
 import org.eclipse.uml2.uml.Lifeline;
@@ -85,6 +88,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STATE_INVARIANT;
 	}
@@ -94,23 +98,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.STATE_INVARIANT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.STATE_INVARIANT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.STATE_INVARIANT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -229,9 +235,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getCovereds() {
+	public EList<Lifeline> getCovereds() {
 		if (covereds == null) {
-			covereds = new EObjectWithInverseResolvingEList.ManyInverse(
+			covereds = new EObjectWithInverseResolvingEList.ManyInverse<Lifeline>(
 				Lifeline.class, this, UMLPackage.STATE_INVARIANT__COVERED,
 				UMLPackage.LIFELINE__COVERED_BY);
 		}
@@ -243,6 +249,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Lifeline getCovered(String name) {
 		return getCovered(name, false);
 	}
@@ -252,9 +259,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Iterator i = getCovereds().iterator(); i.hasNext();) {
-			Lifeline covered = (Lifeline) i.next();
+		coveredLoop : for (Lifeline covered : getCovereds()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(covered.getName())
 				: name.equals(covered.getName())))
@@ -278,25 +285,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STATE_INVARIANT__COVERED :
-				return ((InternalEList) getCovereds()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				return ((InternalEList) getGeneralOrderings()).basicRemove(
+				return ((InternalEList<?>) getGeneralOrderings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
 				return basicSetEnclosingInteraction(null, msgs);
@@ -313,6 +321,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
@@ -366,15 +375,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__NAME :
 				setName((String) newValue);
@@ -384,18 +397,20 @@
 				return;
 			case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__COVERED :
 				getCovereds().clear();
-				getCovereds().addAll((Collection) newValue);
+				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
 				getGeneralOrderings().clear();
-				getGeneralOrderings().addAll((Collection) newValue);
+				getGeneralOrderings().addAll(
+					(Collection<? extends GeneralOrdering>) newValue);
 				return;
 			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
 				setEnclosingInteraction((Interaction) newValue);
@@ -415,6 +430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
@@ -459,6 +475,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
@@ -517,6 +534,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.STATE_INVARIANT__INVARIANT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateMachineImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateMachineImpl.java
index 80988d4..5ede7c7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateMachineImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StateMachineImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateMachineImpl.java,v 1.26 2006/11/14 18:02:18 khussey Exp $
+ * $Id: StateMachineImpl.java,v 1.27 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,18 +37,38 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterSet;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Pseudostate;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.Region;
 import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StateMachine;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.StateMachineOperations;
@@ -83,7 +103,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList regions = null;
+	protected EList<Region> regions = null;
 
 	/**
 	 * The cached value of the '{@link #getSubmachineStates() <em>Submachine State</em>}' reference list.
@@ -93,7 +113,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList submachineStates = null;
+	protected EList<State> submachineStates = null;
 
 	/**
 	 * The cached value of the '{@link #getConnectionPoints() <em>Connection Point</em>}' containment reference list.
@@ -103,7 +123,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList connectionPoints = null;
+	protected EList<Pseudostate> connectionPoints = null;
 
 	/**
 	 * The cached value of the '{@link #getExtendedStateMachines() <em>Extended State Machine</em>}' reference list.
@@ -113,7 +133,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList extendedStateMachines = null;
+	protected EList<StateMachine> extendedStateMachines = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -129,6 +149,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STATE_MACHINE;
 	}
@@ -138,25 +159,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.STATE_MACHINE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STATE_MACHINE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STATE_MACHINE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -164,24 +186,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -191,9 +219,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRegions() {
+	public EList<Region> getRegions() {
 		if (regions == null) {
-			regions = new EObjectContainmentWithInverseEList.Resolving(
+			regions = new EObjectContainmentWithInverseEList.Resolving<Region>(
 				Region.class, this, UMLPackage.STATE_MACHINE__REGION,
 				UMLPackage.REGION__STATE_MACHINE);
 		}
@@ -229,8 +257,7 @@
 	 */
 	public Region getRegion(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		regionLoop : for (Iterator i = getRegions().iterator(); i.hasNext();) {
-			Region region = (Region) i.next();
+		regionLoop : for (Region region : getRegions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(region.getName())
 				: name.equals(region.getName())))
@@ -247,9 +274,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubmachineStates() {
+	public EList<State> getSubmachineStates() {
 		if (submachineStates == null) {
-			submachineStates = new EObjectWithInverseResolvingEList(
+			submachineStates = new EObjectWithInverseResolvingEList<State>(
 				State.class, this, UMLPackage.STATE_MACHINE__SUBMACHINE_STATE,
 				UMLPackage.STATE__SUBMACHINE);
 		}
@@ -272,9 +299,7 @@
 	 */
 	public State getSubmachineState(String name, boolean ignoreCase,
 			EClass eClass) {
-		submachineStateLoop : for (Iterator i = getSubmachineStates()
-			.iterator(); i.hasNext();) {
-			State submachineState = (State) i.next();
+		submachineStateLoop : for (State submachineState : getSubmachineStates()) {
 			if (eClass != null && !eClass.isInstance(submachineState))
 				continue submachineStateLoop;
 			if (name != null && !(ignoreCase
@@ -291,9 +316,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getConnectionPoints() {
+	public EList<Pseudostate> getConnectionPoints() {
 		if (connectionPoints == null) {
-			connectionPoints = new EObjectContainmentWithInverseEList.Resolving(
+			connectionPoints = new EObjectContainmentWithInverseEList.Resolving<Pseudostate>(
 				Pseudostate.class, this,
 				UMLPackage.STATE_MACHINE__CONNECTION_POINT,
 				UMLPackage.PSEUDOSTATE__STATE_MACHINE);
@@ -330,9 +355,7 @@
 	 */
 	public Pseudostate getConnectionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		connectionPointLoop : for (Iterator i = getConnectionPoints()
-			.iterator(); i.hasNext();) {
-			Pseudostate connectionPoint = (Pseudostate) i.next();
+		connectionPointLoop : for (Pseudostate connectionPoint : getConnectionPoints()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(connectionPoint.getName())
 				: name.equals(connectionPoint.getName())))
@@ -349,9 +372,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtendedStateMachines() {
+	public EList<StateMachine> getExtendedStateMachines() {
 		if (extendedStateMachines == null) {
-			extendedStateMachines = new EObjectResolvingEList(
+			extendedStateMachines = new EObjectResolvingEList<StateMachine>(
 				StateMachine.class, this,
 				UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE);
 		}
@@ -374,9 +397,7 @@
 	 */
 	public StateMachine getExtendedStateMachine(String name,
 			boolean ignoreCase, EClass eClass) {
-		extendedStateMachineLoop : for (Iterator i = getExtendedStateMachines()
-			.iterator(); i.hasNext();) {
-			StateMachine extendedStateMachine = (StateMachine) i.next();
+		extendedStateMachineLoop : for (StateMachine extendedStateMachine : getExtendedStateMachines()) {
 			if (eClass != null && !eClass.isInstance(extendedStateMachine))
 				continue extendedStateMachineLoop;
 			if (name != null && !(ignoreCase
@@ -394,7 +415,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifierContext(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateMachineOperations.validateClassifierContext(this,
 			diagnostics, context);
 	}
@@ -405,7 +426,7 @@
 	 * @generated
 	 */
 	public boolean validateContextClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateMachineOperations.validateContextClassifier(this,
 			diagnostics, context);
 	}
@@ -416,7 +437,7 @@
 	 * @generated
 	 */
 	public boolean validateConnectionPoints(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StateMachineOperations.validateConnectionPoints(this,
 			diagnostics, context);
 	}
@@ -426,7 +447,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMethod(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMethod(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StateMachineOperations
 			.validateMethod(this, diagnostics, context);
 	}
@@ -473,24 +495,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -505,8 +529,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -518,22 +542,23 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__SPECIFICATION :
 				if (specification != null)
 					msgs = ((InternalEObject) specification).eInverseRemove(
@@ -541,13 +566,14 @@
 						BehavioralFeature.class, msgs);
 				return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__REGION :
-				return ((InternalEList) getRegions()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList) getSubmachineStates()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -557,102 +583,103 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__PRECONDITION :
-				return ((InternalEList) getPreconditions()).basicRemove(
+				return ((InternalEList<?>) getPreconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__POSTCONDITION :
-				return ((InternalEList) getPostconditions()).basicRemove(
+				return ((InternalEList<?>) getPostconditions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				return ((InternalEList) getOwnedParameterSets()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getOwnedParameterSets())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__SPECIFICATION :
 				return basicSetSpecification(null, msgs);
 			case UMLPackage.STATE_MACHINE__REGION :
-				return ((InternalEList) getRegions()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList) getSubmachineStates()).basicRemove(
+				return ((InternalEList<?>) getSubmachineStates()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList) getConnectionPoints()).basicRemove(
+				return ((InternalEList<?>) getConnectionPoints()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -663,6 +690,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
@@ -832,15 +860,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__NAME :
 				setName((String) newValue);
@@ -850,22 +882,26 @@
 				return;
 			case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -881,7 +917,8 @@
 				return;
 			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -891,126 +928,151 @@
 				return;
 			case UMLPackage.STATE_MACHINE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__IS_REENTRANT :
 				setIsReentrant(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR :
 				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors().addAll((Collection) newValue);
+				getRedefinedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends Parameter>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__PRECONDITION :
 				getPreconditions().clear();
-				getPreconditions().addAll((Collection) newValue);
+				getPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__POSTCONDITION :
 				getPostconditions().clear();
-				getPostconditions().addAll((Collection) newValue);
+				getPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
 				getOwnedParameterSets().clear();
-				getOwnedParameterSets().addAll((Collection) newValue);
+				getOwnedParameterSets().addAll(
+					(Collection<? extends ParameterSet>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__SPECIFICATION :
 				setSpecification((BehavioralFeature) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__REGION :
 				getRegions().clear();
-				getRegions().addAll((Collection) newValue);
+				getRegions().addAll((Collection<? extends Region>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
 				getSubmachineStates().clear();
-				getSubmachineStates().addAll((Collection) newValue);
+				getSubmachineStates().addAll(
+					(Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
 				getConnectionPoints().clear();
-				getConnectionPoints().addAll((Collection) newValue);
+				getConnectionPoints().addAll(
+					(Collection<? extends Pseudostate>) newValue);
 				return;
 			case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE :
 				getExtendedStateMachines().clear();
-				getExtendedStateMachines().addAll((Collection) newValue);
+				getExtendedStateMachines().addAll(
+					(Collection<? extends StateMachine>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1021,6 +1083,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
@@ -1176,6 +1239,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
@@ -1348,6 +1412,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.STATE_MACHINE__REGION)
@@ -1372,6 +1437,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
 			|| eIsSet(UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE);
@@ -1386,6 +1452,7 @@
 		return isRedefinitionContextValid(redefined);
 	}
 
+	@Override
 	public boolean isRedefinitionContextValid(RedefinableElement redefined) {
 		return redefined instanceof StateMachine
 			&& isRedefinitionContextValid((StateMachine) redefined);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StereotypeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StereotypeImpl.java
index 1a2ba68..abaa6da 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StereotypeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StereotypeImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StereotypeImpl.java,v 1.21 2006/04/10 19:16:21 khussey Exp $
+ * $Id: StereotypeImpl.java,v 1.22 2006/12/14 15:49:32 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -21,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -30,15 +31,33 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Extension;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Image;
+import org.eclipse.uml2.uml.InterfaceRealization;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageImport;
+import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Reception;
 import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.StereotypeOperations;
@@ -68,7 +87,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList icons = null;
+	protected EList<Image> icons = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -84,6 +103,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STEREOTYPE;
 	}
@@ -93,10 +113,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getIcons() {
+	public EList<Image> getIcons() {
 		if (icons == null) {
-			icons = new EObjectContainmentEList.Resolving(Image.class, this,
-				UMLPackage.STEREOTYPE__ICON);
+			icons = new EObjectContainmentEList.Resolving<Image>(Image.class,
+				this, UMLPackage.STEREOTYPE__ICON);
 		}
 		return icons;
 	}
@@ -117,7 +137,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNameNotClash(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNameNotClash(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StereotypeOperations.validateNameNotClash(this, diagnostics,
 			context);
 	}
@@ -127,7 +148,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGeneralize(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGeneralize(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StereotypeOperations.validateGeneralize(this, diagnostics,
 			context);
 	}
@@ -175,11 +197,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtendedMetaclasses() {
+	public EList<org.eclipse.uml2.uml.Class> getExtendedMetaclasses() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.STEREOTYPE.getEOperations().get(6));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
+				.get(this, UMLPackage.Literals.STEREOTYPE.getEOperations().get(
+					6));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.STEREOTYPE.getEOperations()
 					.get(6), result = StereotypeOperations
@@ -195,11 +219,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAllExtendedMetaclasses() {
+	public EList<org.eclipse.uml2.uml.Class> getAllExtendedMetaclasses() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.STEREOTYPE.getEOperations().get(7));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
+				.get(this, UMLPackage.Literals.STEREOTYPE.getEOperations().get(
+					7));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.STEREOTYPE.getEOperations()
 					.get(7), result = StereotypeOperations
@@ -242,82 +268,84 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				return ((InternalEList) getNestedClassifiers()).basicRemove(
+				return ((InternalEList<?>) getNestedClassifiers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				return ((InternalEList) getOwnedOperations()).basicRemove(
+				return ((InternalEList<?>) getOwnedOperations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				return ((InternalEList) getOwnedReceptions()).basicRemove(
+				return ((InternalEList<?>) getOwnedReceptions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STEREOTYPE__ICON :
-				return ((InternalEList) getIcons()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getIcons()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -327,6 +355,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STEREOTYPE__EANNOTATIONS :
@@ -468,15 +497,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STEREOTYPE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__NAME :
 				setName((String) newValue);
@@ -486,22 +519,26 @@
 				return;
 			case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -517,7 +554,8 @@
 				return;
 			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -527,88 +565,105 @@
 				return;
 			case UMLPackage.STEREOTYPE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_PORT :
 				getOwnedPorts().clear();
-				getOwnedPorts().addAll((Collection) newValue);
+				getOwnedPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
 				getNestedClassifiers().clear();
-				getNestedClassifiers().addAll((Collection) newValue);
+				getNestedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
 				getOwnedOperations().clear();
-				getOwnedOperations().addAll((Collection) newValue);
+				getOwnedOperations().addAll(
+					(Collection<? extends Operation>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__SUPER_CLASS :
 				getSuperClasses().clear();
-				getSuperClasses().addAll((Collection) newValue);
+				getSuperClasses()
+					.addAll(
+						(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__IS_ACTIVE :
 				setIsActive(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
 				getOwnedReceptions().clear();
-				getOwnedReceptions().addAll((Collection) newValue);
+				getOwnedReceptions().addAll(
+					(Collection<? extends Reception>) newValue);
 				return;
 			case UMLPackage.STEREOTYPE__ICON :
 				getIcons().clear();
-				getIcons().addAll((Collection) newValue);
+				getIcons().addAll((Collection<? extends Image>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -619,6 +674,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STEREOTYPE__EANNOTATIONS :
@@ -744,6 +800,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STEREOTYPE__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StringExpressionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StringExpressionImpl.java
index 7594717..683e70c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StringExpressionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StringExpressionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StringExpressionImpl.java,v 1.20 2006/11/14 18:02:16 khussey Exp $
+ * $Id: StringExpressionImpl.java,v 1.21 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,7 +37,10 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -45,6 +48,7 @@
 import org.eclipse.uml2.uml.TemplateableElement;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.ValueSpecification;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.StringExpressionOperations;
@@ -80,7 +84,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -100,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList subExpressions = null;
+	protected EList<StringExpression> subExpressions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -116,6 +120,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STRING_EXPRESSION;
 	}
@@ -125,23 +130,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -150,9 +157,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -189,9 +196,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -332,9 +337,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubExpressions() {
+	public EList<StringExpression> getSubExpressions() {
 		if (subExpressions == null) {
-			subExpressions = new EObjectContainmentWithInverseEList.Resolving(
+			subExpressions = new EObjectContainmentWithInverseEList.Resolving<StringExpression>(
 				StringExpression.class, this,
 				UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION,
 				UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION);
@@ -373,9 +378,7 @@
 	 */
 	public StringExpression getSubExpression(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		subExpressionLoop : for (Iterator i = getSubExpressions().iterator(); i
-			.hasNext();) {
-			StringExpression subExpression = (StringExpression) i.next();
+		subExpressionLoop : for (StringExpression subExpression : getSubExpressions()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(subExpression.getName())
 				: name.equals(subExpression.getName())))
@@ -458,12 +461,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -489,7 +493,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOperands(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOperands(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StringExpressionOperations.validateOperands(this, diagnostics,
 			context);
 	}
@@ -500,7 +505,7 @@
 	 * @generated
 	 */
 	public boolean validateSubexpressions(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StringExpressionOperations.validateSubexpressions(this,
 			diagnostics, context);
 	}
@@ -519,15 +524,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -542,8 +549,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -555,8 +562,8 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return ((InternalEList) getSubExpressions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubExpressions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -571,18 +578,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
@@ -590,15 +598,15 @@
 			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				return ((InternalEList) getOperands()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return ((InternalEList) getSubExpressions()).basicRemove(
+				return ((InternalEList<?>) getSubExpressions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
 				return basicSetOwningExpression(null, msgs);
@@ -611,6 +619,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -631,6 +640,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
@@ -696,15 +706,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__NAME :
 				setName((String) newValue);
@@ -714,7 +728,8 @@
 				return;
 			case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -733,18 +748,21 @@
 				return;
 			case UMLPackage.STRING_EXPRESSION__OPERAND :
 				getOperands().clear();
-				getOperands().addAll((Collection) newValue);
+				getOperands().addAll(
+					(Collection<? extends ValueSpecification>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
 				getSubExpressions().clear();
-				getSubExpressions().addAll((Collection) newValue);
+				getSubExpressions().addAll(
+					(Collection<? extends StringExpression>) newValue);
 				return;
 			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
 				setOwningExpression((StringExpression) newValue);
@@ -758,6 +776,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
@@ -814,6 +833,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
@@ -866,7 +886,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == TemplateableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
@@ -885,7 +906,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == TemplateableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
@@ -920,6 +942,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING)
@@ -946,6 +969,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureActionImpl.java
index 08757f8..66ab2ad 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuralFeatureActionImpl.java,v 1.22 2006/11/14 18:02:20 khussey Exp $
+ * $Id: StructuralFeatureActionImpl.java,v 1.23 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuralFeature;
 import org.eclipse.uml2.uml.StructuralFeatureAction;
@@ -99,6 +108,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION;
 	}
@@ -108,22 +118,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -293,7 +305,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotStatic(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotStatic(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StructuralFeatureActionOperations.validateNotStatic(this,
 			diagnostics, context);
 	}
@@ -303,7 +316,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StructuralFeatureActionOperations.validateSameType(this,
 			diagnostics, context);
 	}
@@ -313,7 +327,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StructuralFeatureActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -323,7 +338,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateVisibility(DiagnosticChain diagnostics, Map context) {
+	public boolean validateVisibility(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StructuralFeatureActionOperations.validateVisibility(this,
 			diagnostics, context);
 	}
@@ -334,7 +350,7 @@
 	 * @generated
 	 */
 	public boolean validateOneFeaturingClassifier(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StructuralFeatureActionOperations
 			.validateOneFeaturingClassifier(this, diagnostics, context);
 	}
@@ -344,18 +360,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
@@ -363,26 +380,26 @@
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 		}
@@ -394,6 +411,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -481,15 +499,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME :
 				setName((String) newValue);
@@ -499,7 +521,8 @@
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -515,35 +538,44 @@
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
 				setStructuralFeature((StructuralFeature) newValue);
@@ -560,6 +592,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -628,6 +661,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -713,6 +747,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureImpl.java
index bad4bff..c549564 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuralFeatureImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuralFeatureImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: StructuralFeatureImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,6 +35,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.MultiplicityElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -196,6 +199,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STRUCTURAL_FEATURE;
 	}
@@ -247,23 +251,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -613,7 +619,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGt0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGt0(this,
 			diagnostics, context);
 	}
@@ -623,7 +630,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateLowerGe0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateLowerGe0(this,
 			diagnostics, context);
 	}
@@ -633,7 +641,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGeLower(this,
 			diagnostics, context);
 	}
@@ -644,7 +653,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
@@ -655,7 +664,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationConstant(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationConstant(this, diagnostics, context);
 	}
@@ -728,18 +737,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
@@ -755,6 +765,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
@@ -834,15 +845,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE__NAME :
 				setName((String) newValue);
@@ -852,7 +867,8 @@
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -896,6 +912,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
@@ -955,6 +972,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
@@ -1015,7 +1033,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.STRUCTURAL_FEATURE__TYPE :
@@ -1050,7 +1069,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.TYPED_ELEMENT__TYPE :
@@ -1085,6 +1105,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1119,6 +1140,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredActivityNodeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredActivityNodeImpl.java
index bb16f06..843bced 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredActivityNodeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredActivityNodeImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredActivityNodeImpl.java,v 1.30 2006/11/14 18:02:15 khussey Exp $
+ * $Id: StructuredActivityNodeImpl.java,v 1.31 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -40,9 +40,14 @@
 import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.ActivityGroup;
 import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ElementImport;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.PackageImport;
@@ -99,7 +104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList elementImports = null;
+	protected EList<ElementImport> elementImports = null;
 
 	/**
 	 * The cached value of the '{@link #getPackageImports() <em>Package Import</em>}' containment reference list.
@@ -109,7 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList packageImports = null;
+	protected EList<PackageImport> packageImports = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedRules() <em>Owned Rule</em>}' containment reference list.
@@ -119,7 +124,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedRules = null;
+	protected EList<Constraint> ownedRules = null;
 
 	/**
 	 * The cached value of the '{@link #getVariables() <em>Variable</em>}' containment reference list.
@@ -129,7 +134,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList variables = null;
+	protected EList<Variable> variables = null;
 
 	/**
 	 * The cached value of the '{@link #getEdges() <em>Edge</em>}' containment reference list.
@@ -139,7 +144,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList edges = null;
+	protected EList<ActivityEdge> edges = null;
 
 	/**
 	 * The default value of the '{@link #isMustIsolate() <em>Must Isolate</em>}' attribute.
@@ -169,7 +174,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList nodes = null;
+	protected EList<ActivityNode> nodes = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -185,6 +190,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE;
 	}
@@ -194,24 +200,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -221,25 +228,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
 			OWNED_MEMBER_ESUBSETS);
 	}
 
@@ -259,9 +267,7 @@
 	 */
 	public NamedElement getOwnedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		ownedMemberLoop : for (Iterator i = getOwnedMembers().iterator(); i
-			.hasNext();) {
-			NamedElement ownedMember = (NamedElement) i.next();
+		ownedMemberLoop : for (NamedElement ownedMember : getOwnedMembers()) {
 			if (eClass != null && !eClass.isInstance(ownedMember))
 				continue ownedMemberLoop;
 			if (name != null && !(ignoreCase
@@ -278,24 +284,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER,
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER,
 						MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -313,8 +321,7 @@
 	 * @generated
 	 */
 	public NamedElement getMember(String name, boolean ignoreCase, EClass eClass) {
-		memberLoop : for (Iterator i = getMembers().iterator(); i.hasNext();) {
-			NamedElement member = (NamedElement) i.next();
+		memberLoop : for (NamedElement member : getMembers()) {
 			if (eClass != null && !eClass.isInstance(member))
 				continue memberLoop;
 			if (name != null && !(ignoreCase
@@ -331,9 +338,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getElementImports() {
+	public EList<ElementImport> getElementImports() {
 		if (elementImports == null) {
-			elementImports = new EObjectContainmentWithInverseEList.Resolving(
+			elementImports = new EObjectContainmentWithInverseEList.Resolving<ElementImport>(
 				ElementImport.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT,
 				UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
@@ -370,9 +377,7 @@
 	 */
 	public ElementImport getElementImport(PackageableElement importedElement,
 			boolean createOnDemand) {
-		elementImportLoop : for (Iterator i = getElementImports().iterator(); i
-			.hasNext();) {
-			ElementImport elementImport = (ElementImport) i.next();
+		elementImportLoop : for (ElementImport elementImport : getElementImports()) {
 			if (importedElement != null
 				&& !importedElement.equals(elementImport.getImportedElement()))
 				continue elementImportLoop;
@@ -388,9 +393,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPackageImports() {
+	public EList<PackageImport> getPackageImports() {
 		if (packageImports == null) {
-			packageImports = new EObjectContainmentWithInverseEList.Resolving(
+			packageImports = new EObjectContainmentWithInverseEList.Resolving<PackageImport>(
 				PackageImport.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT,
 				UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
@@ -429,9 +434,7 @@
 	 */
 	public PackageImport getPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage, boolean createOnDemand) {
-		packageImportLoop : for (Iterator i = getPackageImports().iterator(); i
-			.hasNext();) {
-			PackageImport packageImport = (PackageImport) i.next();
+		packageImportLoop : for (PackageImport packageImport : getPackageImports()) {
 			if (importedPackage != null
 				&& !importedPackage.equals(packageImport.getImportedPackage()))
 				continue packageImportLoop;
@@ -447,9 +450,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedRules() {
+	public EList<Constraint> getOwnedRules() {
 		if (ownedRules == null) {
-			ownedRules = new EObjectContainmentWithInverseEList.Resolving(
+			ownedRules = new EObjectContainmentWithInverseEList.Resolving<Constraint>(
 				Constraint.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE,
 				UMLPackage.CONSTRAINT__CONTEXT);
@@ -495,9 +498,7 @@
 	 */
 	public Constraint getOwnedRule(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedRuleLoop : for (Iterator i = getOwnedRules().iterator(); i
-			.hasNext();) {
-			Constraint ownedRule = (Constraint) i.next();
+		ownedRuleLoop : for (Constraint ownedRule : getOwnedRules()) {
 			if (eClass != null && !eClass.isInstance(ownedRule))
 				continue ownedRuleLoop;
 			if (name != null && !(ignoreCase
@@ -516,12 +517,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedMembers() {
+	public EList<PackageableElement> getImportedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER,
 					result = NamespaceOperations.getImportedMembers(this));
@@ -547,9 +549,7 @@
 	 */
 	public PackageableElement getImportedMember(String name,
 			boolean ignoreCase, EClass eClass) {
-		importedMemberLoop : for (Iterator i = getImportedMembers().iterator(); i
-			.hasNext();) {
-			PackageableElement importedMember = (PackageableElement) i.next();
+		importedMemberLoop : for (PackageableElement importedMember : getImportedMembers()) {
 			if (eClass != null && !eClass.isInstance(importedMember))
 				continue importedMemberLoop;
 			if (name != null && !(ignoreCase
@@ -566,24 +566,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubgroups() {
+	public EList<ActivityGroup> getSubgroups() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList subgroups = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			@SuppressWarnings("unchecked")
+			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
+				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
 			if (subgroups == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP,
-					subgroups = new DerivedUnionEObjectEList(
+					subgroups = new DerivedUnionEObjectEList<ActivityGroup>(
 						ActivityGroup.class, this,
 						UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList(ActivityGroup.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
+			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null);
 	}
 
 	/**
@@ -591,25 +592,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedNodes() {
+	public EList<ActivityNode> getContainedNodes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedNodes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
 			if (containedNodes == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
-					containedNodes = new DerivedUnionEObjectEList(
-						ActivityNode.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE,
-						CONTAINED_NODE_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
+						containedNodes = new DerivedUnionEObjectEList<ActivityNode>(
+							ActivityNode.class,
+							this,
+							UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE,
+							CONTAINED_NODE_ESUBSETS));
 			}
 			return containedNodes;
 		}
-		return new DerivedUnionEObjectEList(ActivityNode.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE,
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class,
+			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE,
 			CONTAINED_NODE_ESUBSETS);
 	}
 
@@ -629,9 +636,7 @@
 	 */
 	public ActivityNode getContainedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedNodeLoop : for (Iterator i = getContainedNodes().iterator(); i
-			.hasNext();) {
-			ActivityNode containedNode = (ActivityNode) i.next();
+		containedNodeLoop : for (ActivityNode containedNode : getContainedNodes()) {
 			if (eClass != null && !eClass.isInstance(containedNode))
 				continue containedNodeLoop;
 			if (name != null && !(ignoreCase
@@ -648,25 +653,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getContainedEdges() {
+	public EList<ActivityEdge> getContainedEdges() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList containedEdges = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			@SuppressWarnings("unchecked")
+			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
 			if (containedEdges == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
-					containedEdges = new DerivedUnionEObjectEList(
-						ActivityEdge.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE,
-						CONTAINED_EDGE_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE,
+						containedEdges = new DerivedUnionEObjectEList<ActivityEdge>(
+							ActivityEdge.class,
+							this,
+							UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE,
+							CONTAINED_EDGE_ESUBSETS));
 			}
 			return containedEdges;
 		}
-		return new DerivedUnionEObjectEList(ActivityEdge.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE,
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class,
+			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE,
 			CONTAINED_EDGE_ESUBSETS);
 	}
 
@@ -686,9 +697,7 @@
 	 */
 	public ActivityEdge getContainedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedEdgeLoop : for (Iterator i = getContainedEdges().iterator(); i
-			.hasNext();) {
-			ActivityEdge containedEdge = (ActivityEdge) i.next();
+		containedEdgeLoop : for (ActivityEdge containedEdge : getContainedEdges()) {
 			if (eClass != null && !eClass.isInstance(containedEdge))
 				continue containedEdgeLoop;
 			if (name != null && !(ignoreCase
@@ -705,9 +714,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getVariables() {
+	public EList<Variable> getVariables() {
 		if (variables == null) {
-			variables = new EObjectContainmentWithInverseEList.Resolving(
+			variables = new EObjectContainmentWithInverseEList.Resolving<Variable>(
 				Variable.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE,
 				UMLPackage.VARIABLE__SCOPE);
@@ -746,8 +755,7 @@
 	 */
 	public Variable getVariable(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		variableLoop : for (Iterator i = getVariables().iterator(); i.hasNext();) {
-			Variable variable = (Variable) i.next();
+		variableLoop : for (Variable variable : getVariables()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(variable.getName())
 				: name.equals(variable.getName())))
@@ -766,9 +774,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNodes() {
+	public EList<ActivityNode> getNodes() {
 		if (nodes == null) {
-			nodes = new EObjectContainmentWithInverseEList.Resolving(
+			nodes = new EObjectContainmentWithInverseEList.Resolving<ActivityNode>(
 				ActivityNode.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE,
 				UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE);
@@ -805,8 +813,7 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		nodeLoop : for (Iterator i = getNodes().iterator(); i.hasNext();) {
-			ActivityNode node = (ActivityNode) i.next();
+		nodeLoop : for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
 			if (name != null && !(ignoreCase
@@ -853,9 +860,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getEdges() {
+	public EList<ActivityEdge> getEdges() {
 		if (edges == null) {
-			edges = new EObjectContainmentWithInverseEList.Resolving(
+			edges = new EObjectContainmentWithInverseEList.Resolving<ActivityEdge>(
 				ActivityEdge.class, this,
 				UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE,
 				UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE);
@@ -892,8 +899,7 @@
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		edgeLoop : for (Iterator i = getEdges().iterator(); i.hasNext();) {
-			ActivityEdge edge = (ActivityEdge) i.next();
+		edgeLoop : for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
 			if (name != null && !(ignoreCase
@@ -955,7 +961,7 @@
 	 * @generated
 	 */
 	public boolean validateMembersDistinguishable(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return NamespaceOperations.validateMembersDistinguishable(this,
 			diagnostics, context);
 	}
@@ -987,11 +993,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedElements() {
+	public EList<PackageableElement> getImportedElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE.getEOperations().get(3));
+			@SuppressWarnings("unchecked")
+			EList<PackageableElement> result = (EList<PackageableElement>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE.getEOperations()
+					.get(3));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE.getEOperations()
 					.get(3), result = NamespaceOperations
@@ -1007,11 +1015,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getImportedPackages() {
+	public EList<org.eclipse.uml2.uml.Package> getImportedPackages() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.NAMESPACE.getEOperations().get(4));
+			@SuppressWarnings("unchecked")
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
+				.get(this, UMLPackage.Literals.NAMESPACE.getEOperations()
+					.get(4));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.NAMESPACE.getEOperations()
 					.get(4), result = NamespaceOperations
@@ -1027,7 +1037,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getNamesOfMember(NamedElement element) {
+	public EList<String> getNamesOfMember(NamedElement element) {
 		return NamespaceOperations.getNamesOfMember(this, element);
 	}
 
@@ -1045,7 +1055,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList importMembers(EList imps) {
+	public EList<PackageableElement> importMembers(
+			EList<PackageableElement> imps) {
 		return NamespaceOperations.importMembers(this, imps);
 	}
 
@@ -1054,7 +1065,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList excludeCollisions(EList imps) {
+	public EList<PackageableElement> excludeCollisions(
+			EList<PackageableElement> imps) {
 		return NamespaceOperations.excludeCollisions(this, imps);
 	}
 
@@ -1064,7 +1076,7 @@
 	 * @generated
 	 */
 	public boolean validateNodesAndEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics,
 			context);
 	}
@@ -1074,7 +1086,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNotContained(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNotContained(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateNotContained(this, diagnostics,
 			context);
 	}
@@ -1084,7 +1097,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateGroupOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateGroupOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ActivityGroupOperations.validateGroupOwned(this, diagnostics,
 			context);
 	}
@@ -1094,7 +1108,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateEdges(DiagnosticChain diagnostics, Map context) {
+	public boolean validateEdges(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return StructuredActivityNodeOperations.validateEdges(this,
 			diagnostics, context);
 	}
@@ -1104,15 +1119,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1123,39 +1140,42 @@
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetActivity((Activity) otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
 				return basicSetInActivity((Activity) otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return ((InternalEList) getVariables())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return ((InternalEList) getEdges()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1165,18 +1185,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
@@ -1184,44 +1205,46 @@
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
 				return basicSetInActivity(null, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return ((InternalEList) getVariables()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getVariables()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return ((InternalEList) getEdges()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
+					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1231,6 +1254,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
@@ -1346,15 +1370,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME :
 				setName((String) newValue);
@@ -1364,7 +1392,8 @@
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -1380,65 +1409,80 @@
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
 				setInActivity((Activity) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
 				getVariables().clear();
-				getVariables().addAll((Collection) newValue);
+				getVariables()
+					.addAll((Collection<? extends Variable>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
 				getEdges().clear();
-				getEdges().addAll((Collection) newValue);
+				getEdges()
+					.addAll((Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE :
 				setMustIsolate(((Boolean) newValue).booleanValue());
 				return;
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
 				getNodes().clear();
-				getNodes().addAll((Collection) newValue);
+				getNodes()
+					.addAll((Collection<? extends ActivityNode>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -1449,6 +1493,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
@@ -1535,6 +1580,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
@@ -1636,7 +1682,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == Namespace.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
@@ -1679,7 +1726,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == Namespace.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
@@ -1722,6 +1770,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1759,6 +1808,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT)
@@ -1883,6 +1933,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner() || isSetSuperGroup() || isSetInActivity();
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredClassifierImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredClassifierImpl.java
index 0179904..60bf369 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredClassifierImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/StructuredClassifierImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredClassifierImpl.java,v 1.27 2006/11/14 18:02:20 khussey Exp $
+ * $Id: StructuredClassifierImpl.java,v 1.28 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -24,6 +23,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
@@ -37,18 +37,29 @@
 import org.eclipse.uml2.common.util.DerivedEObjectEList;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ConnectableElement;
 import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Feature;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredClassifier;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
 
 import org.eclipse.uml2.uml.internal.operations.StructuredClassifierOperations;
@@ -85,7 +96,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedAttributes = null;
+	protected EList<Property> ownedAttributes = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedConnectors() <em>Owned Connector</em>}' containment reference list.
@@ -95,7 +106,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedConnectors = null;
+	protected EList<Connector> ownedConnectors = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -111,6 +122,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.STRUCTURED_CLASSIFIER;
 	}
@@ -120,23 +132,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRoles() {
+	public EList<ConnectableElement> getRoles() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList roles = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
+			@SuppressWarnings("unchecked")
+			EList<ConnectableElement> roles = (EList<ConnectableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
 			if (roles == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE,
-					roles = new DerivedUnionEObjectEList(
+					roles = new DerivedUnionEObjectEList<ConnectableElement>(
 						ConnectableElement.class, this,
 						UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS));
 			}
 			return roles;
 		}
-		return new DerivedUnionEObjectEList(ConnectableElement.class, this,
+		return new DerivedUnionEObjectEList<ConnectableElement>(
+			ConnectableElement.class, this,
 			UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS);
 	}
 
@@ -156,8 +171,7 @@
 	 */
 	public ConnectableElement getRole(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		roleLoop : for (Iterator i = getRoles().iterator(); i.hasNext();) {
-			ConnectableElement role = (ConnectableElement) i.next();
+		roleLoop : for (ConnectableElement role : getRoles()) {
 			if (eClass != null && !eClass.isInstance(role))
 				continue roleLoop;
 			if (name != null && !(ignoreCase
@@ -176,25 +190,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
 			OWNED_MEMBER_ESUBSETS);
 	}
 
@@ -203,23 +218,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAttributes() {
+	public EList<Property> getAttributes() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList attributes = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			@SuppressWarnings("unchecked")
+			EList<Property> attributes = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
 			if (attributes == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__ATTRIBUTE,
-					attributes = new DerivedUnionEObjectEList(Property.class,
-						this, UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE,
+					attributes = new DerivedUnionEObjectEList<Property>(
+						Property.class, this,
+						UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE,
 						ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList(Property.class, this,
+		return new DerivedUnionEObjectEList<Property>(Property.class, this,
 			UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
@@ -228,24 +245,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getMembers() {
+	public EList<NamedElement> getMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList members = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> members = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
 			if (members == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__MEMBER,
-					members = new DerivedUnionEObjectEList(NamedElement.class,
-						this, UMLPackage.STRUCTURED_CLASSIFIER__MEMBER,
+					members = new DerivedUnionEObjectEList<NamedElement>(
+						NamedElement.class, this,
+						UMLPackage.STRUCTURED_CLASSIFIER__MEMBER,
 						MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.STRUCTURED_CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -253,23 +272,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getFeatures() {
+	public EList<Feature> getFeatures() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList features = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.CLASSIFIER__FEATURE);
+			@SuppressWarnings("unchecked")
+			EList<Feature> features = (EList<Feature>) cache.get(eResource,
+				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
 			if (features == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.CLASSIFIER__FEATURE,
-					features = new DerivedUnionEObjectEList(Feature.class,
-						this, UMLPackage.STRUCTURED_CLASSIFIER__FEATURE,
+					features = new DerivedUnionEObjectEList<Feature>(
+						Feature.class, this,
+						UMLPackage.STRUCTURED_CLASSIFIER__FEATURE,
 						FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList(Feature.class, this,
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
 			UMLPackage.STRUCTURED_CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
 	}
 
@@ -278,9 +299,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedAttributes() {
+	public EList<Property> getOwnedAttributes() {
 		if (ownedAttributes == null) {
-			ownedAttributes = new EObjectContainmentEList.Resolving(
+			ownedAttributes = new EObjectContainmentEList.Resolving<Property>(
 				Property.class, this,
 				UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE);
 		}
@@ -327,9 +348,7 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Iterator i = getOwnedAttributes().iterator(); i
-			.hasNext();) {
-			Property ownedAttribute = (Property) i.next();
+		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
 			if (name != null && !(ignoreCase
@@ -346,26 +365,30 @@
 	}
 
 	protected static class PartEList
-			extends DerivedEObjectEList {
+			extends DerivedEObjectEList<Property> {
 
-		protected PartEList(Class dataClass, InternalEObject owner,
+		protected PartEList(Class<?> dataClass, InternalEObject owner,
 				int featureID, int[] sourceFeatureIDs) {
 			super(dataClass, owner, featureID, sourceFeatureIDs);
 		}
 
-		public List basicList() {
+		@Override
+		public List<Property> basicList() {
 			return new PartEList(dataClass, owner, featureID, sourceFeatureIDs) {
 
-				public ListIterator listIterator(int index) {
+				@Override
+				public ListIterator<Property> listIterator(int index) {
 					return basicListIterator(index);
 				}
 			};
 		}
 
+		@Override
 		protected boolean isIncluded(EStructuralFeature feature) {
 			return false;
 		}
 
+		@Override
 		protected boolean isIncluded(Object object) {
 			return super.isIncluded(object)
 				&& ((Property) object).isComposite();
@@ -384,12 +407,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getParts() {
+	public EList<Property> getParts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList parts = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
+			@SuppressWarnings("unchecked")
+			EList<Property> parts = (EList<Property>) cache.get(eResource,
+				this, UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
 			if (parts == null) {
 				cache
 					.put(eResource, this,
@@ -420,8 +444,7 @@
 	 */
 	public Property getPart(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		partLoop : for (Iterator i = getParts().iterator(); i.hasNext();) {
-			Property part = (Property) i.next();
+		partLoop : for (Property part : getParts()) {
 			if (eClass != null && !eClass.isInstance(part))
 				continue partLoop;
 			if (name != null && !(ignoreCase
@@ -440,9 +463,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedConnectors() {
+	public EList<Connector> getOwnedConnectors() {
 		if (ownedConnectors == null) {
-			ownedConnectors = new EObjectContainmentEList.Resolving(
+			ownedConnectors = new EObjectContainmentEList.Resolving<Connector>(
 				Connector.class, this,
 				UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
 		}
@@ -478,9 +501,7 @@
 	 */
 	public Connector getOwnedConnector(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedConnectorLoop : for (Iterator i = getOwnedConnectors().iterator(); i
-			.hasNext();) {
-			Connector ownedConnector = (Connector) i.next();
+		ownedConnectorLoop : for (Connector ownedConnector : getOwnedConnectors()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(ownedConnector.getName())
 				: name.equals(ownedConnector.getName())))
@@ -498,7 +519,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicities(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return StructuredClassifierOperations.validateMultiplicities(this,
 			diagnostics, context);
 	}
@@ -519,61 +540,62 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return ((InternalEList) getOwnedAttributes()).basicRemove(
+				return ((InternalEList<?>) getOwnedAttributes()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				return ((InternalEList) getOwnedConnectors()).basicRemove(
+				return ((InternalEList<?>) getOwnedConnectors()).basicRemove(
 					otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -584,6 +606,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
@@ -697,15 +720,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__NAME :
 				setName((String) newValue);
@@ -715,22 +742,26 @@
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -746,7 +777,8 @@
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -756,46 +788,55 @@
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
 				getOwnedAttributes().clear();
-				getOwnedAttributes().addAll((Collection) newValue);
+				getOwnedAttributes().addAll(
+					(Collection<? extends Property>) newValue);
 				return;
 			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
 				getOwnedConnectors().clear();
-				getOwnedConnectors().addAll((Collection) newValue);
+				getOwnedConnectors().addAll(
+					(Collection<? extends Connector>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -806,6 +847,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
@@ -898,6 +940,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
@@ -1029,6 +1072,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE)
@@ -1050,6 +1094,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
 			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE);
@@ -1075,6 +1120,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers() || isSetRoles();
 	}
@@ -1096,6 +1142,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
 			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SubstitutionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SubstitutionImpl.java
index 98ee45d..47dbbaa 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SubstitutionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/SubstitutionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SubstitutionImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: SubstitutionImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -18,6 +18,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -32,6 +33,8 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectWithInverseResolvingEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.OpaqueExpression;
 import org.eclipse.uml2.uml.StringExpression;
@@ -84,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.SUBSTITUTION;
 	}
@@ -93,9 +97,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSuppliers() {
+	public EList<NamedElement> getSuppliers() {
 		if (suppliers == null) {
-			suppliers = new SubsetSupersetEObjectResolvingEList(
+			suppliers = new SubsetSupersetEObjectResolvingEList<NamedElement>(
 				NamedElement.class, this, UMLPackage.SUBSTITUTION__SUPPLIER,
 				null, SUPPLIER_ESUBSETS);
 		}
@@ -117,9 +121,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getClients() {
+	public EList<NamedElement> getClients() {
 		if (clients == null) {
-			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse(
+			clients = new SubsetSupersetEObjectWithInverseResolvingEList.ManyInverse<NamedElement>(
 				NamedElement.class, this, UMLPackage.SUBSTITUTION__CLIENT,
 				null, CLIENT_ESUBSETS,
 				UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY);
@@ -181,7 +185,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newContract != null) {
-				EList suppliers = getSuppliers();
+				EList<NamedElement> suppliers = getSuppliers();
 				if (!suppliers.contains(newContract)) {
 					suppliers.add(newContract);
 				}
@@ -224,7 +228,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newSubstitutingClassifier != null) {
-				EList clients = getClients();
+				EList<NamedElement> clients = getClients();
 				if (!clients.contains(newSubstitutingClassifier)) {
 					clients.add(newSubstitutingClassifier);
 				}
@@ -268,15 +272,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -291,7 +297,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.SUBSTITUTION__CLIENT :
-				return ((InternalEList) getClients()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClients())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -306,18 +313,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
@@ -325,7 +333,7 @@
 			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.SUBSTITUTION__CLIENT :
-				return ((InternalEList) getClients()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getClients()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.SUBSTITUTION__MAPPING :
 				return basicSetMapping(null, msgs);
@@ -340,6 +348,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -360,6 +369,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
@@ -427,15 +437,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.SUBSTITUTION__NAME :
 				setName((String) newValue);
@@ -445,7 +459,8 @@
 				return;
 			case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -458,11 +473,13 @@
 				return;
 			case UMLPackage.SUBSTITUTION__SUPPLIER :
 				getSuppliers().clear();
-				getSuppliers().addAll((Collection) newValue);
+				getSuppliers().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.SUBSTITUTION__CLIENT :
 				getClients().clear();
-				getClients().addAll((Collection) newValue);
+				getClients().addAll(
+					(Collection<? extends NamedElement>) newValue);
 				return;
 			case UMLPackage.SUBSTITUTION__MAPPING :
 				setMapping((OpaqueExpression) newValue);
@@ -482,6 +499,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
@@ -532,6 +550,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateBindingImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateBindingImpl.java
index ac993d0..23d0e93 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateBindingImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateBindingImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateBindingImpl.java,v 1.16 2006/11/14 18:02:16 khussey Exp $
+ * $Id: TemplateBindingImpl.java,v 1.17 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -36,6 +37,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameterSubstitution;
@@ -86,7 +88,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList parameterSubstitutions = null;
+	protected EList<TemplateParameterSubstitution> parameterSubstitutions = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -102,6 +104,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEMPLATE_BINDING;
 	}
@@ -111,22 +114,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTargets() {
+	public EList<Element> getTargets() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList targets = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			@SuppressWarnings("unchecked")
+			EList<Element> targets = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
 			if (targets == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET,
-					targets = new DerivedUnionEObjectEList(Element.class, this,
+					targets = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS);
 	}
 
@@ -135,23 +140,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -160,22 +167,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSources() {
+	public EList<Element> getSources() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList sources = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			@SuppressWarnings("unchecked")
+			EList<Element> sources = (EList<Element>) cache.get(eResource,
+				this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
 			if (sources == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE,
-					sources = new DerivedUnionEObjectEList(Element.class, this,
+					sources = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
 						UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS);
 	}
 
@@ -227,9 +236,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getParameterSubstitutions() {
+	public EList<TemplateParameterSubstitution> getParameterSubstitutions() {
 		if (parameterSubstitutions == null) {
-			parameterSubstitutions = new EObjectContainmentWithInverseEList.Resolving(
+			parameterSubstitutions = new EObjectContainmentWithInverseEList.Resolving<TemplateParameterSubstitution>(
 				TemplateParameterSubstitution.class, this,
 				UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION,
 				UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING);
@@ -318,7 +327,7 @@
 	 * @generated
 	 */
 	public boolean validateParameterSubstitutionFormal(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return TemplateBindingOperations.validateParameterSubstitutionFormal(
 			this, diagnostics, context);
 	}
@@ -329,7 +338,7 @@
 	 * @generated
 	 */
 	public boolean validateOneParameterSubstitution(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return TemplateBindingOperations.validateOneParameterSubstitution(this,
 			diagnostics, context);
 	}
@@ -339,15 +348,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return ((InternalEList) getParameterSubstitutions()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -362,17 +373,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return ((InternalEList) getParameterSubstitutions())
+				return ((InternalEList<?>) getParameterSubstitutions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
 				return basicSetBoundElement(null, msgs);
@@ -385,6 +397,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -401,6 +414,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
@@ -438,22 +452,28 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_BINDING__SIGNATURE :
 				setSignature((TemplateSignature) newValue);
 				return;
 			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
 				getParameterSubstitutions().clear();
-				getParameterSubstitutions().addAll((Collection) newValue);
+				getParameterSubstitutions()
+					.addAll(
+						(Collection<? extends TemplateParameterSubstitution>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
 				setBoundElement((TemplateableElement) newValue);
@@ -467,6 +487,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
@@ -493,6 +514,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
@@ -535,6 +557,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
 			|| eIsSet(UMLPackage.TEMPLATE_BINDING__SIGNATURE);
@@ -569,6 +592,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION);
@@ -593,6 +617,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -613,6 +638,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
 			|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterImpl.java
index ac53e07..bb62c72 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameterImpl.java,v 1.16 2006/11/14 18:02:18 khussey Exp $
+ * $Id: TemplateParameterImpl.java,v 1.17 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,7 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -120,6 +122,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEMPLATE_PARAMETER;
 	}
@@ -141,23 +144,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -599,7 +604,7 @@
 	 * @generated
 	 */
 	public boolean validateMustBeCompatible(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TemplateParameterOperations.validateMustBeCompatible(this,
 			diagnostics, context);
 	}
@@ -609,12 +614,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -647,14 +654,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
 				return basicSetSignature(null, msgs);
@@ -673,6 +681,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -689,6 +698,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -730,15 +740,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
 				setSignature((TemplateSignature) newValue);
@@ -764,6 +778,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -796,6 +811,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
@@ -839,6 +855,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
@@ -862,6 +879,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterSubstitutionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterSubstitutionImpl.java
index dc83111..6d9b57a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterSubstitutionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateParameterSubstitutionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameterSubstitutionImpl.java,v 1.17 2006/11/14 18:02:19 khussey Exp $
+ * $Id: TemplateParameterSubstitutionImpl.java,v 1.18 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,6 +38,7 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectContainmentEList;
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateBinding;
@@ -76,7 +78,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList actuals = null;
+	protected EList<ParameterableElement> actuals = null;
 
 	/**
 	 * The cached value of the '{@link #getFormal() <em>Formal</em>}' reference.
@@ -96,7 +98,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedActuals = null;
+	protected EList<ParameterableElement> ownedActuals = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -112,6 +114,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION;
 	}
@@ -121,20 +124,21 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache
 					.put(
 						eResource,
 						this,
 						UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-						ownedElements = new DerivedUnionEObjectEList(
+						ownedElements = new DerivedUnionEObjectEList<Element>(
 							Element.class,
 							this,
 							UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT,
@@ -142,7 +146,7 @@
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -152,9 +156,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getActuals() {
+	public EList<ParameterableElement> getActuals() {
 		if (actuals == null) {
-			actuals = new SubsetSupersetEObjectResolvingEList(
+			actuals = new SubsetSupersetEObjectResolvingEList<ParameterableElement>(
 				ParameterableElement.class, this,
 				UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, null,
 				ACTUAL_ESUBSETS);
@@ -211,9 +215,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedActuals() {
+	public EList<ParameterableElement> getOwnedActuals() {
 		if (ownedActuals == null) {
-			ownedActuals = new SubsetSupersetEObjectContainmentEList.Resolving(
+			ownedActuals = new SubsetSupersetEObjectContainmentEList.Resolving<ParameterableElement>(
 				ParameterableElement.class, this,
 				UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL,
 				OWNED_ACTUAL_ESUPERSETS, null);
@@ -302,7 +306,7 @@
 	 * @generated
 	 */
 	public boolean validateMustBeCompatible(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TemplateParameterSubstitutionOperations
 			.validateMustBeCompatible(this, diagnostics, context);
 	}
@@ -312,12 +316,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -331,17 +337,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				return ((InternalEList) getOwnedActuals()).basicRemove(
+				return ((InternalEList<?>) getOwnedActuals()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
 				return basicSetTemplateBinding(null, msgs);
@@ -354,6 +361,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -370,6 +378,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
@@ -403,26 +412,32 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL :
 				setFormal((TemplateParameter) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL :
 				getActuals().clear();
-				getActuals().addAll((Collection) newValue);
+				getActuals().addAll(
+					(Collection<? extends ParameterableElement>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
 				getOwnedActuals().clear();
-				getOwnedActuals().addAll((Collection) newValue);
+				getOwnedActuals().addAll(
+					(Collection<? extends ParameterableElement>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
 				setTemplateBinding((TemplateBinding) newValue);
@@ -436,6 +451,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
@@ -465,6 +481,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
@@ -536,6 +553,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL);
@@ -560,6 +578,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateSignatureImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateSignatureImpl.java
index 7f3bd92..eb99ae3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateSignatureImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateSignatureImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateSignatureImpl.java,v 1.17 2006/11/14 18:02:16 khussey Exp $
+ * $Id: TemplateSignatureImpl.java,v 1.18 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,6 +38,7 @@
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.common.util.SubsetSupersetEObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
@@ -74,7 +76,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList parameters = null;
+	protected EList<TemplateParameter> parameters = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedParameters() <em>Owned Parameter</em>}' containment reference list.
@@ -84,7 +86,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ownedParameters = null;
+	protected EList<TemplateParameter> ownedParameters = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -100,6 +102,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEMPLATE_SIGNATURE;
 	}
@@ -109,23 +112,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -135,9 +140,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getParameters() {
+	public EList<TemplateParameter> getParameters() {
 		if (parameters == null) {
-			parameters = new SubsetSupersetEObjectResolvingEList(
+			parameters = new SubsetSupersetEObjectResolvingEList<TemplateParameter>(
 				TemplateParameter.class, this,
 				UMLPackage.TEMPLATE_SIGNATURE__PARAMETER, null,
 				PARAMETER_ESUBSETS);
@@ -214,9 +219,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedParameters() {
+	public EList<TemplateParameter> getOwnedParameters() {
 		if (ownedParameters == null) {
-			ownedParameters = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedParameters = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<TemplateParameter>(
 				TemplateParameter.class, this,
 				UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER,
 				OWNED_PARAMETER_ESUPERSETS, null,
@@ -250,7 +255,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwnElements(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwnElements(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return TemplateSignatureOperations.validateOwnElements(this,
 			diagnostics, context);
 	}
@@ -260,15 +266,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -282,17 +290,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList) getOwnedParameters()).basicRemove(
+				return ((InternalEList<?>) getOwnedParameters()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
 				return basicSetTemplate(null, msgs);
@@ -305,6 +314,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -321,6 +331,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -350,23 +361,29 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
 				getParameters().clear();
-				getParameters().addAll((Collection) newValue);
+				getParameters().addAll(
+					(Collection<? extends TemplateParameter>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
 				getOwnedParameters().clear();
-				getOwnedParameters().addAll((Collection) newValue);
+				getOwnedParameters().addAll(
+					(Collection<? extends TemplateParameter>) newValue);
 				return;
 			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
 				setTemplate((TemplateableElement) newValue);
@@ -380,6 +397,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -406,6 +424,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
@@ -489,6 +508,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
 			|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE);
@@ -499,6 +519,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateableElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateableElementImpl.java
index 8d19543..e679554 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateableElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TemplateableElementImpl.java
@@ -8,18 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateableElementImpl.java,v 1.17 2006/11/14 18:02:17 khussey Exp $
+ * $Id: TemplateableElementImpl.java,v 1.18 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
-
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -33,7 +32,9 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.TemplateableElement;
@@ -68,7 +69,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList templateBindings = null;
+	protected EList<TemplateBinding> templateBindings = null;
 
 	/**
 	 * The cached value of the '{@link #getOwnedTemplateSignature() <em>Owned Template Signature</em>}' containment reference.
@@ -94,6 +95,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEMPLATEABLE_ELEMENT;
 	}
@@ -103,23 +105,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT,
 			OWNED_ELEMENT_ESUBSETS);
 	}
@@ -129,9 +133,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTemplateBindings() {
+	public EList<TemplateBinding> getTemplateBindings() {
 		if (templateBindings == null) {
-			templateBindings = new EObjectContainmentWithInverseEList.Resolving(
+			templateBindings = new EObjectContainmentWithInverseEList.Resolving<TemplateBinding>(
 				TemplateBinding.class, this,
 				UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING,
 				UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
@@ -168,9 +172,7 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (Iterator i = getTemplateBindings()
-			.iterator(); i.hasNext();) {
-			TemplateBinding templateBinding = (TemplateBinding) i.next();
+		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
 			if (signature != null
 				&& !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
@@ -301,12 +303,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList parameterableElements() {
+	public EList<ParameterableElement> parameterableElements() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
-				UMLPackage.Literals.TEMPLATEABLE_ELEMENT.getEOperations()
-					.get(0));
+			@SuppressWarnings("unchecked")
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
+				.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
+					.getEOperations().get(0));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT
 					.getEOperations().get(0),
@@ -332,15 +335,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -360,17 +365,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
@@ -383,6 +389,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
@@ -410,19 +417,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -436,6 +448,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
@@ -459,6 +472,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
@@ -495,6 +509,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TestIdentityActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TestIdentityActionImpl.java
index 3d19930..1c7d3d5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TestIdentityActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TestIdentityActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TestIdentityActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: TestIdentityActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -111,6 +120,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TEST_IDENTITY_ACTION;
 	}
@@ -120,23 +130,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(InputPin.class,
-							this, UMLPackage.TEST_IDENTITY_ACTION__INPUT,
+						inputs = new DerivedUnionEObjectEList<InputPin>(
+							InputPin.class, this,
+							UMLPackage.TEST_IDENTITY_ACTION__INPUT,
 							INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.TEST_IDENTITY_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -145,22 +157,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.TEST_IDENTITY_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.TEST_IDENTITY_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.TEST_IDENTITY_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -489,7 +503,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateNoType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateNoType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return TestIdentityActionOperations.validateNoType(this, diagnostics,
 			context);
 	}
@@ -499,7 +514,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return TestIdentityActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -510,7 +526,7 @@
 	 * @generated
 	 */
 	public boolean validateResultIsBoolean(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TestIdentityActionOperations.validateResultIsBoolean(this,
 			diagnostics, context);
 	}
@@ -520,18 +536,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
@@ -539,26 +556,26 @@
 			case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
 				return basicSetFirst(null, msgs);
 			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
@@ -574,6 +591,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
@@ -665,15 +683,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__NAME :
 				setName((String) newValue);
@@ -683,7 +705,8 @@
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -699,35 +722,44 @@
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
 				setFirst((InputPin) newValue);
@@ -747,6 +779,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
@@ -818,6 +851,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
@@ -907,6 +941,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__FIRST)
@@ -928,6 +963,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeConstraintImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeConstraintImpl.java
index c512961..c0268f3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeConstraintImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeConstraintImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeConstraintImpl.java,v 1.20 2006/11/14 18:02:16 khussey Exp $
+ * $Id: TimeConstraintImpl.java,v 1.21 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -17,11 +17,15 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -86,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TIME_CONSTRAINT;
 	}
@@ -180,6 +185,7 @@
 		return msgs;
 	}
 
+	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
 
@@ -224,6 +230,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
 		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
@@ -249,6 +256,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
@@ -308,15 +316,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TIME_CONSTRAINT__NAME :
 				setName((String) newValue);
@@ -326,7 +338,8 @@
 				return;
 			case UMLPackage.TIME_CONSTRAINT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -339,7 +352,8 @@
 				return;
 			case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT :
 				getConstrainedElements().clear();
-				getConstrainedElements().addAll((Collection) newValue);
+				getConstrainedElements().addAll(
+					(Collection<? extends Element>) newValue);
 				return;
 			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
 				setSpecification((ValueSpecification) newValue);
@@ -359,6 +373,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
@@ -406,6 +421,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
@@ -453,6 +469,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeEventImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeEventImpl.java
index 88ab16b..69ad98a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeEventImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeEventImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeEventImpl.java,v 1.19 2006/11/14 18:02:19 khussey Exp $
+ * $Id: TimeEventImpl.java,v 1.20 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -34,6 +35,8 @@
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -108,6 +111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TIME_EVENT;
 	}
@@ -117,23 +121,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TIME_EVENT__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TIME_EVENT__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TIME_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -270,7 +276,7 @@
 	 * @generated
 	 */
 	public boolean validateWhenNonNegative(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TimeEventOperations.validateWhenNonNegative(this, diagnostics,
 			context);
 	}
@@ -280,7 +286,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateStartingTime(DiagnosticChain diagnostics, Map context) {
+	public boolean validateStartingTime(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return TimeEventOperations.validateStartingTime(this, diagnostics,
 			context);
 	}
@@ -290,18 +297,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
@@ -319,6 +327,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TIME_EVENT__EANNOTATIONS :
@@ -372,15 +381,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TIME_EVENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TIME_EVENT__NAME :
 				setName((String) newValue);
@@ -390,7 +403,8 @@
 				return;
 			case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -416,6 +430,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_EVENT__EANNOTATIONS :
@@ -457,6 +472,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_EVENT__EANNOTATIONS :
@@ -499,6 +515,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -527,6 +544,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TIME_EVENT__WHEN);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeExpressionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeExpressionImpl.java
index a55b486..7972d67 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeExpressionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeExpressionImpl.java
@@ -8,17 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeExpressionImpl.java,v 1.14 2006/11/14 18:02:17 khussey Exp $
+ * $Id: TimeExpressionImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
-
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -26,6 +25,8 @@
 
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Observation;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -73,7 +74,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList observations = null;
+	protected EList<Observation> observations = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -89,6 +90,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TIME_EXPRESSION;
 	}
@@ -140,9 +142,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getObservations() {
+	public EList<Observation> getObservations() {
 		if (observations == null) {
-			observations = new EObjectResolvingEList(Observation.class, this,
+			observations = new EObjectResolvingEList<Observation>(
+				Observation.class, this,
 				UMLPackage.TIME_EXPRESSION__OBSERVATION);
 		}
 		return observations;
@@ -164,9 +167,7 @@
 	 */
 	public Observation getObservation(String name, boolean ignoreCase,
 			EClass eClass) {
-		observationLoop : for (Iterator i = getObservations().iterator(); i
-			.hasNext();) {
-			Observation observation = (Observation) i.next();
+		observationLoop : for (Observation observation : getObservations()) {
 			if (eClass != null && !eClass.isInstance(observation))
 				continue observationLoop;
 			if (name != null && !(ignoreCase
@@ -192,6 +193,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
@@ -247,15 +249,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TIME_EXPRESSION__NAME :
 				setName((String) newValue);
@@ -265,7 +271,8 @@
 				return;
 			case UMLPackage.TIME_EXPRESSION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -284,7 +291,8 @@
 				return;
 			case UMLPackage.TIME_EXPRESSION__OBSERVATION :
 				getObservations().clear();
-				getObservations().addAll((Collection) newValue);
+				getObservations().addAll(
+					(Collection<? extends Observation>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -295,6 +303,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
@@ -339,6 +348,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeIntervalImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeIntervalImpl.java
index 02854b5..b3a325d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeIntervalImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeIntervalImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeIntervalImpl.java,v 1.12 2006/11/14 18:02:18 khussey Exp $
+ * $Id: TimeIntervalImpl.java,v 1.13 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -56,6 +56,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TIME_INTERVAL;
 	}
@@ -102,6 +103,7 @@
 
 	}
 
+	@Override
 	public void setMax(ValueSpecification newMax) {
 
 		if (newMax != null && !(newMax instanceof TimeExpression)) {
@@ -162,6 +164,7 @@
 
 	}
 
+	@Override
 	public void setMin(ValueSpecification newMin) {
 
 		if (newMin != null && !(newMin instanceof TimeExpression)) {
@@ -185,6 +188,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
@@ -242,6 +246,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeObservationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeObservationImpl.java
index c67a70d..233becf 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeObservationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TimeObservationImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeObservationImpl.java,v 1.6 2006/11/14 18:02:15 khussey Exp $
+ * $Id: TimeObservationImpl.java,v 1.7 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -16,11 +16,14 @@
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -91,6 +94,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TIME_OBSERVATION;
 	}
@@ -170,6 +174,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
@@ -223,15 +228,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TIME_OBSERVATION__NAME :
 				setName((String) newValue);
@@ -241,7 +250,8 @@
 				return;
 			case UMLPackage.TIME_OBSERVATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -267,6 +277,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
@@ -308,6 +319,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
@@ -350,6 +362,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TransitionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TransitionImpl.java
index 16983b3..25f7cb3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TransitionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TransitionImpl.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TransitionImpl.java,v 1.23 2006/11/14 18:02:16 khussey Exp $
+ * $Id: TransitionImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -24,6 +23,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -43,9 +43,13 @@
 
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.Region;
 import org.eclipse.uml2.uml.StateMachine;
@@ -178,7 +182,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList triggers = null;
+	protected EList<Trigger> triggers = null;
 
 	/**
 	 * The cached value of the '{@link #getSource() <em>Source</em>}' reference.
@@ -204,6 +208,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TRANSITION;
 	}
@@ -213,24 +218,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getRedefinedElements() {
+	public EList<RedefinableElement> getRedefinedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList redefinedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
+				.get(eResource, this,
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
 			if (redefinedElements == null) {
-				cache.put(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-					redefinedElements = new DerivedUnionEObjectEList(
-						RedefinableElement.class, this,
-						UMLPackage.TRANSITION__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache
+					.put(
+						eResource,
+						this,
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(
+							RedefinableElement.class, this,
+							UMLPackage.TRANSITION__REDEFINED_ELEMENT,
+							REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList(RedefinableElement.class, this,
+		return new DerivedUnionEObjectEList<RedefinableElement>(
+			RedefinableElement.class, this,
 			UMLPackage.TRANSITION__REDEFINED_ELEMENT,
 			REDEFINED_ELEMENT_ESUBSETS);
 	}
@@ -251,9 +262,7 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (Iterator i = getRedefinedElements()
-			.iterator(); i.hasNext();) {
-			RedefinableElement redefinedElement = (RedefinableElement) i.next();
+		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
 			if (name != null && !(ignoreCase
@@ -270,23 +279,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.TRANSITION__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.TRANSITION__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.TRANSITION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -295,9 +306,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedRules() {
+	public EList<Constraint> getOwnedRules() {
 		if (ownedRules == null) {
-			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving(
+			ownedRules = new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
 				Constraint.class, this, UMLPackage.TRANSITION__OWNED_RULE,
 				null, OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 		}
@@ -309,23 +320,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public EList getRedefinitionContexts() {
+	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
 
 		if (cache != null) {
-			EList result = (EList) cache.get(this,
+			@SuppressWarnings("unchecked")
+			EList<Classifier> result = (EList<Classifier>) cache.get(this,
 				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
-				List redefinitionContexts = redefinitionContext == null
-					? Collections.EMPTY_LIST
-					: Collections.singletonList(redefinitionContext);
+				List<Classifier> redefinitionContexts = redefinitionContext == null
+					? Collections.<Classifier> emptyList()
+					: Collections
+						.<Classifier> singletonList(redefinitionContext);
 				cache
 					.put(
 						this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						result = new EcoreEList.UnmodifiableEList(
+						result = new EcoreEList.UnmodifiableEList<Classifier>(
 							this,
 							UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 							redefinitionContexts.size(), redefinitionContexts
@@ -336,10 +349,10 @@
 		}
 
 		Classifier redefinitionContext = redefinitionContext();
-		List redefinitionContexts = redefinitionContext == null
-			? Collections.EMPTY_LIST
+		List<Classifier> redefinitionContexts = redefinitionContext == null
+			? Collections.<Classifier> emptyList()
 			: Collections.singletonList(redefinitionContext);
-		return new EcoreEList.UnmodifiableEList(this,
+		return new EcoreEList.UnmodifiableEList<Classifier>(this,
 			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
 			redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
@@ -360,9 +373,7 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Iterator i = getRedefinitionContexts()
-			.iterator(); i.hasNext();) {
-			Classifier redefinitionContext = (Classifier) i.next();
+		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
 			if (name != null && !(ignoreCase
@@ -670,7 +681,7 @@
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newGuard != null) {
-				EList ownedRules = getOwnedRules();
+				EList<Constraint> ownedRules = getOwnedRules();
 				if (!ownedRules.contains(newGuard)) {
 					ownedRules.add(newGuard);
 				}
@@ -803,10 +814,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getTriggers() {
+	public EList<Trigger> getTriggers() {
 		if (triggers == null) {
-			triggers = new EObjectContainmentEList.Resolving(Trigger.class,
-				this, UMLPackage.TRANSITION__TRIGGER);
+			triggers = new EObjectContainmentEList.Resolving<Trigger>(
+				Trigger.class, this, UMLPackage.TRANSITION__TRIGGER);
 		}
 		return triggers;
 	}
@@ -840,8 +851,7 @@
 	 */
 	public Trigger getTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		triggerLoop : for (Iterator i = getTriggers().iterator(); i.hasNext();) {
-			Trigger trigger = (Trigger) i.next();
+		triggerLoop : for (Trigger trigger : getTriggers()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(trigger.getName())
 				: name.equals(trigger.getName())))
@@ -932,7 +942,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionContextValid(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionContextValid(
 			this, diagnostics, context);
 	}
@@ -943,7 +953,7 @@
 	 * @generated
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return RedefinableElementOperations.validateRedefinitionConsistent(
 			this, diagnostics, context);
 	}
@@ -954,7 +964,7 @@
 	 * @generated
 	 */
 	public boolean validateForkSegmentGuards(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateForkSegmentGuards(this,
 			diagnostics, context);
 	}
@@ -965,7 +975,7 @@
 	 * @generated
 	 */
 	public boolean validateJoinSegmentGuards(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateJoinSegmentGuards(this,
 			diagnostics, context);
 	}
@@ -976,7 +986,7 @@
 	 * @generated
 	 */
 	public boolean validateForkSegmentState(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateForkSegmentState(this, diagnostics,
 			context);
 	}
@@ -987,7 +997,7 @@
 	 * @generated
 	 */
 	public boolean validateJoinSegmentState(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateJoinSegmentState(this, diagnostics,
 			context);
 	}
@@ -998,7 +1008,7 @@
 	 * @generated
 	 */
 	public boolean validateOutgoingPseudostates(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateOutgoingPseudostates(this,
 			diagnostics, context);
 	}
@@ -1009,7 +1019,7 @@
 	 * @generated
 	 */
 	public boolean validateInitialTransition(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateInitialTransition(this,
 			diagnostics, context);
 	}
@@ -1020,7 +1030,7 @@
 	 * @generated
 	 */
 	public boolean validateSignaturesCompatible(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return TransitionOperations.validateSignaturesCompatible(this,
 			diagnostics, context);
 	}
@@ -1067,24 +1077,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TRANSITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TRANSITION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.TRANSITION__CONTAINER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -1108,29 +1120,30 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TRANSITION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.TRANSITION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.TRANSITION__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.TRANSITION__CONTAINER :
 				return basicSetContainer(null, msgs);
 			case UMLPackage.TRANSITION__TARGET :
@@ -1138,7 +1151,7 @@
 			case UMLPackage.TRANSITION__EFFECT :
 				return basicSetEffect(null, msgs);
 			case UMLPackage.TRANSITION__TRIGGER :
-				return ((InternalEList) getTriggers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.TRANSITION__SOURCE :
 				return basicSetSource(null, msgs);
@@ -1151,6 +1164,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -1166,6 +1180,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
@@ -1251,15 +1266,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TRANSITION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TRANSITION__NAME :
 				setName((String) newValue);
@@ -1269,22 +1288,26 @@
 				return;
 			case UMLPackage.TRANSITION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TRANSITION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.TRANSITION__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.TRANSITION__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -1309,7 +1332,7 @@
 				return;
 			case UMLPackage.TRANSITION__TRIGGER :
 				getTriggers().clear();
-				getTriggers().addAll((Collection) newValue);
+				getTriggers().addAll((Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.TRANSITION__SOURCE :
 				setSource((Vertex) newValue);
@@ -1323,6 +1346,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
@@ -1388,6 +1412,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TRANSITION__EANNOTATIONS :
@@ -1456,7 +1481,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.TRANSITION__IS_LEAF :
@@ -1477,7 +1503,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
@@ -1498,6 +1525,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1540,6 +1568,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
 			|| eIsSet(UMLPackage.TRANSITION__CONTAINER);
@@ -1584,6 +1613,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.TRANSITION__EFFECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TriggerImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TriggerImpl.java
index e84085a..6990fe7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TriggerImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TriggerImpl.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TriggerImpl.java,v 1.12 2006/11/14 18:02:17 khussey Exp $
+ * $Id: TriggerImpl.java,v 1.13 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -25,6 +25,8 @@
 
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Event;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.StringExpression;
@@ -69,7 +71,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList ports = null;
+	protected EList<Port> ports = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -85,6 +87,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TRIGGER;
 	}
@@ -136,9 +139,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getPorts() {
+	public EList<Port> getPorts() {
 		if (ports == null) {
-			ports = new EObjectResolvingEList(Port.class, this,
+			ports = new EObjectResolvingEList<Port>(Port.class, this,
 				UMLPackage.TRIGGER__PORT);
 		}
 		return ports;
@@ -159,8 +162,7 @@
 	 * @generated
 	 */
 	public Port getPort(String name, Type type, boolean ignoreCase) {
-		portLoop : for (Iterator i = getPorts().iterator(); i.hasNext();) {
-			Port port = (Port) i.next();
+		portLoop : for (Port port : getPorts()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(port.getName())
 				: name.equals(port.getName())))
@@ -177,6 +179,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TRIGGER__EANNOTATIONS :
@@ -220,15 +223,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TRIGGER__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TRIGGER__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TRIGGER__NAME :
 				setName((String) newValue);
@@ -238,7 +245,8 @@
 				return;
 			case UMLPackage.TRIGGER__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TRIGGER__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -248,7 +256,7 @@
 				return;
 			case UMLPackage.TRIGGER__PORT :
 				getPorts().clear();
-				getPorts().addAll((Collection) newValue);
+				getPorts().addAll((Collection<? extends Port>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -259,6 +267,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TRIGGER__EANNOTATIONS :
@@ -294,6 +303,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TRIGGER__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypeImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypeImpl.java
index 615c7b4..0fd1653 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypeImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypeImpl.java
@@ -8,13 +8,14 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TypeImpl.java,v 1.19 2006/11/17 15:48:50 khussey Exp $
+ * $Id: TypeImpl.java,v 1.20 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.ecore.EClass;
@@ -23,6 +24,8 @@
 
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -67,6 +70,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TYPE;
 	}
@@ -121,8 +125,8 @@
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newPackage != null)
-				msgs = ((InternalEList) newPackage.getOwnedTypes()).basicAdd(
-					this, msgs);
+				msgs = ((InternalEList<Type>) newPackage.getOwnedTypes())
+					.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newPackage,
 				UMLPackage.TYPE__PACKAGE, msgs);
 			if (msgs != null)
@@ -152,11 +156,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getAssociations() {
+	public EList<Association> getAssociations() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.TYPE
-				.getEOperations().get(1));
+			@SuppressWarnings("unchecked")
+			EList<Association> result = (EList<Association>) cache.get(this,
+				UMLPackage.Literals.TYPE.getEOperations().get(1));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.TYPE.getEOperations()
 					.get(1), result = TypeOperations.getAssociations(this));
@@ -180,6 +185,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TYPE__EANNOTATIONS :
@@ -229,15 +235,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TYPE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TYPE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TYPE__NAME :
 				setName((String) newValue);
@@ -247,7 +257,8 @@
 				return;
 			case UMLPackage.TYPE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TYPE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -270,6 +281,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TYPE__EANNOTATIONS :
@@ -308,6 +320,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TYPE__EANNOTATIONS :
@@ -362,6 +375,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.TYPE__PACKAGE);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypedElementImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypedElementImpl.java
index 57a4611..007ee9e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypedElementImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/TypedElementImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TypedElementImpl.java,v 1.11 2006/11/14 18:02:15 khussey Exp $
+ * $Id: TypedElementImpl.java,v 1.12 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.TypedElement;
@@ -67,6 +70,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.TYPED_ELEMENT;
 	}
@@ -118,6 +122,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
@@ -159,15 +164,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.TYPED_ELEMENT__NAME :
 				setName((String) newValue);
@@ -177,7 +186,8 @@
 				return;
 			case UMLPackage.TYPED_ELEMENT__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -194,6 +204,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
@@ -226,6 +237,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLFactoryImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLFactoryImpl.java
index 06fd340..c1e7614 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLFactoryImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLFactoryImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLFactoryImpl.java,v 1.15 2006/10/10 20:41:28 khussey Exp $
+ * $Id: UMLFactoryImpl.java,v 1.16 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -277,6 +277,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public EObject create(EClass eClass) {
 		switch (eClass.getClassifierID()) {
 			case UMLPackage.COMMENT :
@@ -686,6 +687,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object createFromString(EDataType eDataType, String initialValue) {
 		switch (eDataType.getClassifierID()) {
 			case UMLPackage.VISIBILITY_KIND :
@@ -738,6 +740,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String convertToString(EDataType eDataType, Object instanceValue) {
 		switch (eDataType.getClassifierID()) {
 			case UMLPackage.VISIBILITY_KIND :
@@ -3217,6 +3220,7 @@
 	 * @deprecated
 	 * @generated
 	 */
+	@Deprecated
 	public static UMLPackage getPackage() {
 		return UMLPackage.eINSTANCE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLPackageImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLPackageImpl.java
index dfda6ce..7496bb7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLPackageImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UMLPackageImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLPackageImpl.java,v 1.17 2006/05/16 15:07:26 khussey Exp $
+ * $Id: UMLPackageImpl.java,v 1.18 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -10939,6 +10939,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected void fixInstanceClass(EClassifier eClassifier) {
 		if (eClassifier.getInstanceClassName() == null) {
 			eClassifier
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UnmarshallActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UnmarshallActionImpl.java
index de4a448..c3ffa87 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UnmarshallActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UnmarshallActionImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UnmarshallActionImpl.java,v 1.23 2006/11/14 18:02:17 khussey Exp $
+ * $Id: UnmarshallActionImpl.java,v 1.24 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
@@ -23,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,8 +37,16 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -78,7 +86,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList results = null;
+	protected EList<OutputPin> results = null;
 
 	/**
 	 * The cached value of the '{@link #getUnmarshallType() <em>Unmarshall Type</em>}' reference.
@@ -114,6 +122,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.UNMARSHALL_ACTION;
 	}
@@ -123,22 +132,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.UNMARSHALL_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -147,21 +157,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -170,10 +182,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getResults() {
+	public EList<OutputPin> getResults() {
 		if (results == null) {
-			results = new EObjectContainmentEList.Resolving(OutputPin.class,
-				this, UMLPackage.UNMARSHALL_ACTION__RESULT);
+			results = new EObjectContainmentEList.Resolving<OutputPin>(
+				OutputPin.class, this, UMLPackage.UNMARSHALL_ACTION__RESULT);
 		}
 		return results;
 	}
@@ -209,8 +221,7 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (Iterator i = getResults().iterator(); i.hasNext();) {
-			OutputPin result = (OutputPin) i.next();
+		resultLoop : for (OutputPin result : getResults()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(result.getName())
 				: name.equals(result.getName())))
@@ -391,7 +402,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateSameType(this, diagnostics,
 			context);
 	}
@@ -402,7 +414,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateMultiplicityOfObject(this,
 			diagnostics, context);
 	}
@@ -413,7 +425,7 @@
 	 * @generated
 	 */
 	public boolean validateNumberOfResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateNumberOfResult(this,
 			diagnostics, context);
 	}
@@ -424,7 +436,7 @@
 	 * @generated
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateTypeAndOrdering(this,
 			diagnostics, context);
 	}
@@ -435,7 +447,7 @@
 	 * @generated
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateMultiplicityOfResult(this,
 			diagnostics, context);
 	}
@@ -446,7 +458,7 @@
 	 * @generated
 	 */
 	public boolean validateStructuralFeature(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateStructuralFeature(this,
 			diagnostics, context);
 	}
@@ -457,7 +469,7 @@
 	 * @generated
 	 */
 	public boolean validateUnmarshallTypeIsClassifier(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return UnmarshallActionOperations.validateUnmarshallTypeIsClassifier(
 			this, diagnostics, context);
 	}
@@ -467,18 +479,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
@@ -486,28 +499,28 @@
 			case UMLPackage.UNMARSHALL_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				return ((InternalEList) getResults()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
@@ -520,6 +533,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
@@ -609,15 +623,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__NAME :
 				setName((String) newValue);
@@ -627,7 +645,8 @@
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -643,39 +662,48 @@
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__RESULT :
 				getResults().clear();
-				getResults().addAll((Collection) newValue);
+				getResults().addAll((Collection<? extends OutputPin>) newValue);
 				return;
 			case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE :
 				setUnmarshallType((Classifier) newValue);
@@ -692,6 +720,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
@@ -763,6 +792,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
@@ -850,6 +880,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.UNMARSHALL_ACTION__RESULT);
@@ -870,6 +901,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.UNMARSHALL_ACTION__OBJECT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UsageImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UsageImpl.java
index 799db0f..a97e1b9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UsageImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UsageImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UsageImpl.java,v 1.2 2005/11/23 20:01:17 khussey Exp $
+ * $Id: UsageImpl.java,v 1.3 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -44,6 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.USAGE;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UseCaseImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UseCaseImpl.java
index 01dcd5e..84032e3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UseCaseImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/UseCaseImpl.java
@@ -8,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UseCaseImpl.java,v 1.23 2006/11/14 18:02:19 khussey Exp $
+ * $Id: UseCaseImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -22,6 +21,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,13 +37,24 @@
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ElementImport;
 import org.eclipse.uml2.uml.Extend;
 import org.eclipse.uml2.uml.ExtensionPoint;
+import org.eclipse.uml2.uml.Generalization;
+import org.eclipse.uml2.uml.GeneralizationSet;
 import org.eclipse.uml2.uml.Include;
+import org.eclipse.uml2.uml.InterfaceRealization;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PackageImport;
 import org.eclipse.uml2.uml.StringExpression;
+import org.eclipse.uml2.uml.Substitution;
+import org.eclipse.uml2.uml.TemplateBinding;
 import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.TemplateSignature;
+import org.eclipse.uml2.uml.Trigger;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.VisibilityKind;
@@ -79,7 +90,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList includes = null;
+	protected EList<Include> includes = null;
 
 	/**
 	 * The cached value of the '{@link #getExtends() <em>Extend</em>}' containment reference list.
@@ -89,7 +100,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList extends_ = null;
+	protected EList<Extend> extends_ = null;
 
 	/**
 	 * The cached value of the '{@link #getExtensionPoints() <em>Extension Point</em>}' containment reference list.
@@ -99,7 +110,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList extensionPoints = null;
+	protected EList<ExtensionPoint> extensionPoints = null;
 
 	/**
 	 * The cached value of the '{@link #getSubjects() <em>Subject</em>}' reference list.
@@ -109,7 +120,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList subjects = null;
+	protected EList<Classifier> subjects = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -125,6 +136,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.USE_CASE;
 	}
@@ -134,25 +146,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedMembers() {
+	public EList<NamedElement> getOwnedMembers() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedMembers = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			@SuppressWarnings("unchecked")
+			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
+				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList(
+					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
 						NamedElement.class, this,
 						UMLPackage.USE_CASE__OWNED_MEMBER,
 						OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList(NamedElement.class, this,
-			UMLPackage.USE_CASE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
+			this, UMLPackage.USE_CASE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -160,9 +173,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getIncludes() {
+	public EList<Include> getIncludes() {
 		if (includes == null) {
-			includes = new EObjectContainmentWithInverseEList.Resolving(
+			includes = new EObjectContainmentWithInverseEList.Resolving<Include>(
 				Include.class, this, UMLPackage.USE_CASE__INCLUDE,
 				UMLPackage.INCLUDE__INCLUDING_CASE);
 		}
@@ -200,8 +213,7 @@
 	 */
 	public Include getInclude(String name, UseCase addition,
 			boolean ignoreCase, boolean createOnDemand) {
-		includeLoop : for (Iterator i = getIncludes().iterator(); i.hasNext();) {
-			Include include = (Include) i.next();
+		includeLoop : for (Include include : getIncludes()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(include.getName())
 				: name.equals(include.getName())))
@@ -220,9 +232,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtends() {
+	public EList<Extend> getExtends() {
 		if (extends_ == null) {
-			extends_ = new EObjectContainmentWithInverseEList.Resolving(
+			extends_ = new EObjectContainmentWithInverseEList.Resolving<Extend>(
 				Extend.class, this, UMLPackage.USE_CASE__EXTEND,
 				UMLPackage.EXTEND__EXTENSION);
 		}
@@ -260,8 +272,7 @@
 	 */
 	public Extend getExtend(String name, UseCase extendedCase,
 			boolean ignoreCase, boolean createOnDemand) {
-		extendLoop : for (Iterator i = getExtends().iterator(); i.hasNext();) {
-			Extend extend = (Extend) i.next();
+		extendLoop : for (Extend extend : getExtends()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(extend.getName())
 				: name.equals(extend.getName())))
@@ -281,9 +292,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getExtensionPoints() {
+	public EList<ExtensionPoint> getExtensionPoints() {
 		if (extensionPoints == null) {
-			extensionPoints = new EObjectContainmentWithInverseEList.Resolving(
+			extensionPoints = new EObjectContainmentWithInverseEList.Resolving<ExtensionPoint>(
 				ExtensionPoint.class, this,
 				UMLPackage.USE_CASE__EXTENSION_POINT,
 				UMLPackage.EXTENSION_POINT__USE_CASE);
@@ -320,9 +331,7 @@
 	 */
 	public ExtensionPoint getExtensionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		extensionPointLoop : for (Iterator i = getExtensionPoints().iterator(); i
-			.hasNext();) {
-			ExtensionPoint extensionPoint = (ExtensionPoint) i.next();
+		extensionPointLoop : for (ExtensionPoint extensionPoint : getExtensionPoints()) {
 			if (name != null && !(ignoreCase
 				? name.equalsIgnoreCase(extensionPoint.getName())
 				: name.equals(extensionPoint.getName())))
@@ -339,9 +348,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getSubjects() {
+	public EList<Classifier> getSubjects() {
 		if (subjects == null) {
-			subjects = new EObjectWithInverseResolvingEList.ManyInverse(
+			subjects = new EObjectWithInverseResolvingEList.ManyInverse<Classifier>(
 				Classifier.class, this, UMLPackage.USE_CASE__SUBJECT,
 				UMLPackage.CLASSIFIER__USE_CASE);
 		}
@@ -363,8 +372,7 @@
 	 * @generated
 	 */
 	public Classifier getSubject(String name, boolean ignoreCase, EClass eClass) {
-		subjectLoop : for (Iterator i = getSubjects().iterator(); i.hasNext();) {
-			Classifier subject = (Classifier) i.next();
+		subjectLoop : for (Classifier subject : getSubjects()) {
 			if (eClass != null && !eClass.isInstance(subject))
 				continue subjectLoop;
 			if (name != null && !(ignoreCase
@@ -381,7 +389,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMustHaveName(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMustHaveName(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return UseCaseOperations.validateMustHaveName(this, diagnostics,
 			context);
 	}
@@ -392,7 +401,7 @@
 	 * @generated
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UseCaseOperations.validateBinaryAssociations(this, diagnostics,
 			context);
 	}
@@ -403,7 +412,7 @@
 	 * @generated
 	 */
 	public boolean validateNoAssociationToUseCase(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UseCaseOperations.validateNoAssociationToUseCase(this,
 			diagnostics, context);
 	}
@@ -414,7 +423,7 @@
 	 * @generated
 	 */
 	public boolean validateCannotIncludeSelf(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return UseCaseOperations.validateCannotIncludeSelf(this, diagnostics,
 			context);
 	}
@@ -424,11 +433,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList allIncludedUseCases() {
+	public EList<UseCase> allIncludedUseCases() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
-			EList result = (EList) cache.get(this, UMLPackage.Literals.USE_CASE
-				.getEOperations().get(4));
+			@SuppressWarnings("unchecked")
+			EList<UseCase> result = (EList<UseCase>) cache.get(this,
+				UMLPackage.Literals.USE_CASE.getEOperations().get(4));
 			if (result == null) {
 				cache.put(this, UMLPackage.Literals.USE_CASE.getEOperations()
 					.get(4), result = UseCaseOperations
@@ -444,24 +454,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -476,8 +488,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
 				if (ownedTemplateSignature != null)
 					msgs = ((InternalEObject) ownedTemplateSignature)
@@ -487,28 +499,32 @@
 				return basicSetOwnedTemplateSignature(
 					(TemplateSignature) otherEnd, msgs);
 			case UMLPackage.USE_CASE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__INCLUDE :
-				return ((InternalEList) getIncludes()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncludes())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__EXTEND :
-				return ((InternalEList) getExtends()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtends())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return ((InternalEList) getExtensionPoints()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtensionPoints())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.USE_CASE__SUBJECT :
-				return ((InternalEList) getSubjects()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubjects())
+					.basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -518,76 +534,77 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.USE_CASE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return ((InternalEList) getElementImports()).basicRemove(
+				return ((InternalEList<?>) getElementImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return ((InternalEList) getPackageImports()).basicRemove(
+				return ((InternalEList<?>) getPackageImports()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_RULE :
-				return ((InternalEList) getOwnedRules()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOwnedRules()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
 				return basicSetOwningTemplateParameter(null, msgs);
 			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				return ((InternalEList) getTemplateBindings()).basicRemove(
+				return ((InternalEList<?>) getTemplateBindings()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
 				return basicSetOwnedTemplateSignature(null, msgs);
 			case UMLPackage.USE_CASE__GENERALIZATION :
-				return ((InternalEList) getGeneralizations()).basicRemove(
+				return ((InternalEList<?>) getGeneralizations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return ((InternalEList) getPowertypeExtents()).basicRemove(
+				return ((InternalEList<?>) getPowertypeExtents()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return ((InternalEList) getSubstitutions()).basicRemove(
+				return ((InternalEList<?>) getSubstitutions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				return ((InternalEList) getCollaborationUses()).basicRemove(
+				return ((InternalEList<?>) getCollaborationUses()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				return ((InternalEList) getOwnedUseCases()).basicRemove(
+				return ((InternalEList<?>) getOwnedUseCases()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__USE_CASE :
-				return ((InternalEList) getUseCases()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				return ((InternalEList) getOwnedBehaviors()).basicRemove(
+				return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return ((InternalEList) getInterfaceRealizations())
+				return ((InternalEList<?>) getInterfaceRealizations())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.USE_CASE__OWNED_TRIGGER :
-				return ((InternalEList) getOwnedTriggers()).basicRemove(
+				return ((InternalEList<?>) getOwnedTriggers()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__INCLUDE :
-				return ((InternalEList) getIncludes()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getIncludes()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.USE_CASE__EXTEND :
-				return ((InternalEList) getExtends()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getExtends()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return ((InternalEList) getExtensionPoints()).basicRemove(
+				return ((InternalEList<?>) getExtensionPoints()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.USE_CASE__SUBJECT :
-				return ((InternalEList) getSubjects()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getSubjects()).basicRemove(otherEnd,
 					msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
@@ -598,6 +615,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
@@ -721,15 +739,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.USE_CASE__NAME :
 				setName((String) newValue);
@@ -739,22 +761,26 @@
 				return;
 			case UMLPackage.USE_CASE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.USE_CASE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
 				getElementImports().clear();
-				getElementImports().addAll((Collection) newValue);
+				getElementImports().addAll(
+					(Collection<? extends ElementImport>) newValue);
 				return;
 			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
 				getPackageImports().clear();
-				getPackageImports().addAll((Collection) newValue);
+				getPackageImports().addAll(
+					(Collection<? extends PackageImport>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_RULE :
 				getOwnedRules().clear();
-				getOwnedRules().addAll((Collection) newValue);
+				getOwnedRules().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.USE_CASE__IS_LEAF :
 				setIsLeaf(((Boolean) newValue).booleanValue());
@@ -770,7 +796,8 @@
 				return;
 			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
 				getTemplateBindings().clear();
-				getTemplateBindings().addAll((Collection) newValue);
+				getTemplateBindings().addAll(
+					(Collection<? extends TemplateBinding>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
 				setOwnedTemplateSignature((TemplateSignature) newValue);
@@ -780,69 +807,81 @@
 				return;
 			case UMLPackage.USE_CASE__GENERALIZATION :
 				getGeneralizations().clear();
-				getGeneralizations().addAll((Collection) newValue);
+				getGeneralizations().addAll(
+					(Collection<? extends Generalization>) newValue);
 				return;
 			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
 				getPowertypeExtents().clear();
-				getPowertypeExtents().addAll((Collection) newValue);
+				getPowertypeExtents().addAll(
+					(Collection<? extends GeneralizationSet>) newValue);
 				return;
 			case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER :
 				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers().addAll((Collection) newValue);
+				getRedefinedClassifiers().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.USE_CASE__GENERAL :
 				getGenerals().clear();
-				getGenerals().addAll((Collection) newValue);
+				getGenerals().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 			case UMLPackage.USE_CASE__SUBSTITUTION :
 				getSubstitutions().clear();
-				getSubstitutions().addAll((Collection) newValue);
+				getSubstitutions().addAll(
+					(Collection<? extends Substitution>) newValue);
 				return;
 			case UMLPackage.USE_CASE__REPRESENTATION :
 				setRepresentation((CollaborationUse) newValue);
 				return;
 			case UMLPackage.USE_CASE__COLLABORATION_USE :
 				getCollaborationUses().clear();
-				getCollaborationUses().addAll((Collection) newValue);
+				getCollaborationUses().addAll(
+					(Collection<? extends CollaborationUse>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_USE_CASE :
 				getOwnedUseCases().clear();
-				getOwnedUseCases().addAll((Collection) newValue);
+				getOwnedUseCases().addAll(
+					(Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.USE_CASE__USE_CASE :
 				getUseCases().clear();
-				getUseCases().addAll((Collection) newValue);
+				getUseCases().addAll((Collection<? extends UseCase>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
 				getOwnedBehaviors().clear();
-				getOwnedBehaviors().addAll((Collection) newValue);
+				getOwnedBehaviors().addAll(
+					(Collection<? extends Behavior>) newValue);
 				return;
 			case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR :
 				setClassifierBehavior((Behavior) newValue);
 				return;
 			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
 				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll((Collection) newValue);
+				getInterfaceRealizations().addAll(
+					(Collection<? extends InterfaceRealization>) newValue);
 				return;
 			case UMLPackage.USE_CASE__OWNED_TRIGGER :
 				getOwnedTriggers().clear();
-				getOwnedTriggers().addAll((Collection) newValue);
+				getOwnedTriggers().addAll(
+					(Collection<? extends Trigger>) newValue);
 				return;
 			case UMLPackage.USE_CASE__INCLUDE :
 				getIncludes().clear();
-				getIncludes().addAll((Collection) newValue);
+				getIncludes().addAll((Collection<? extends Include>) newValue);
 				return;
 			case UMLPackage.USE_CASE__EXTEND :
 				getExtends().clear();
-				getExtends().addAll((Collection) newValue);
+				getExtends().addAll((Collection<? extends Extend>) newValue);
 				return;
 			case UMLPackage.USE_CASE__EXTENSION_POINT :
 				getExtensionPoints().clear();
-				getExtensionPoints().addAll((Collection) newValue);
+				getExtensionPoints().addAll(
+					(Collection<? extends ExtensionPoint>) newValue);
 				return;
 			case UMLPackage.USE_CASE__SUBJECT :
 				getSubjects().clear();
-				getSubjects().addAll((Collection) newValue);
+				getSubjects().addAll(
+					(Collection<? extends Classifier>) newValue);
 				return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -853,6 +892,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
@@ -963,6 +1003,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.USE_CASE__EANNOTATIONS :
@@ -1070,6 +1111,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
 			|| eIsSet(UMLPackage.USE_CASE__INCLUDE)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValuePinImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValuePinImpl.java
index 633d37a..d766fa0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValuePinImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValuePinImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValuePinImpl.java,v 1.23 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ValuePinImpl.java,v 1.24 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -20,6 +20,7 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,8 +29,15 @@
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
 import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.ObjectNodeOrderingKind;
+import org.eclipse.uml2.uml.State;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -81,6 +89,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VALUE_PIN;
 	}
@@ -191,7 +200,7 @@
 	 * @generated
 	 */
 	public boolean validateCompatibleType(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ValuePinOperations.validateCompatibleType(this, diagnostics,
 			context);
 	}
@@ -202,7 +211,7 @@
 	 * @generated
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ValuePinOperations.validateNoIncomingEdges(this, diagnostics,
 			context);
 	}
@@ -212,18 +221,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
@@ -231,16 +241,16 @@
 			case UMLPackage.VALUE_PIN__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.VALUE_PIN__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_PIN__UPPER_BOUND :
 				return basicSetUpperBound(null, msgs);
@@ -259,6 +269,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VALUE_PIN__EANNOTATIONS :
@@ -372,15 +383,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VALUE_PIN__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__NAME :
 				setName((String) newValue);
@@ -390,7 +405,8 @@
 				return;
 			case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -406,23 +422,29 @@
 				return;
 			case UMLPackage.VALUE_PIN__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__TYPE :
 				setType((Type) newValue);
@@ -438,7 +460,7 @@
 				return;
 			case UMLPackage.VALUE_PIN__IN_STATE :
 				getInStates().clear();
-				getInStates().addAll((Collection) newValue);
+				getInStates().addAll((Collection<? extends State>) newValue);
 				return;
 			case UMLPackage.VALUE_PIN__SELECTION :
 				setSelection((Behavior) newValue);
@@ -476,6 +498,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_PIN__EANNOTATIONS :
@@ -571,6 +594,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_PIN__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationActionImpl.java
index a418bc8..568cdac 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValueSpecificationActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: ValueSpecificationActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,6 +36,14 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.OutputPin;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -99,6 +108,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VALUE_SPECIFICATION_ACTION;
 	}
@@ -108,22 +118,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutputs() {
+	public EList<OutputPin> getOutputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList outputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__OUTPUT);
+			@SuppressWarnings("unchecked")
+			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList(OutputPin.class,
-						this, UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT,
+					outputs = new DerivedUnionEObjectEList<OutputPin>(
+						OutputPin.class, this,
+						UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT,
 						OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList(OutputPin.class, this,
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
 			UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
@@ -346,7 +358,7 @@
 	 * @generated
 	 */
 	public boolean validateCompatibleType(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return ValueSpecificationActionOperations.validateCompatibleType(this,
 			diagnostics, context);
 	}
@@ -356,7 +368,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return ValueSpecificationActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -366,18 +379,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
@@ -385,26 +399,26 @@
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
 				return basicSetValue(null, msgs);
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
@@ -418,6 +432,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
@@ -505,15 +520,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME :
 				setName((String) newValue);
@@ -523,7 +542,8 @@
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -539,35 +559,44 @@
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
 				setValue((ValueSpecification) newValue);
@@ -584,6 +613,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
@@ -652,6 +682,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
@@ -737,6 +768,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
 			|| eIsSet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationImpl.java
index 4ffb349..e74d38e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/ValueSpecificationImpl.java
@@ -8,18 +8,21 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValueSpecificationImpl.java,v 1.11 2006/11/14 18:02:16 khussey Exp $
+ * $Id: ValueSpecificationImpl.java,v 1.12 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -72,6 +75,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VALUE_SPECIFICATION;
 	}
@@ -186,6 +190,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
@@ -235,15 +240,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION__NAME :
 				setName((String) newValue);
@@ -253,7 +262,8 @@
 				return;
 			case UMLPackage.VALUE_SPECIFICATION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -276,6 +286,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
@@ -314,6 +325,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
@@ -354,7 +366,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.VALUE_SPECIFICATION__TYPE :
@@ -371,7 +384,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.TYPED_ELEMENT__TYPE :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableActionImpl.java
index d8f3eb6..12335d7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VariableActionImpl.java,v 1.14 2006/11/14 18:02:19 khussey Exp $
+ * $Id: VariableActionImpl.java,v 1.15 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -19,12 +19,21 @@
 
 import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -75,6 +84,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VARIABLE_ACTION;
 	}
@@ -128,7 +138,7 @@
 	 * @generated
 	 */
 	public boolean validateScopeOfVariable(DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return VariableActionOperations.validateScopeOfVariable(this,
 			diagnostics, context);
 	}
@@ -138,6 +148,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
@@ -221,15 +232,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__NAME :
 				setName((String) newValue);
@@ -239,7 +254,8 @@
 				return;
 			case UMLPackage.VARIABLE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -255,35 +271,44 @@
 				return;
 			case UMLPackage.VARIABLE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.VARIABLE_ACTION__VARIABLE :
 				setVariable((Variable) newValue);
@@ -297,6 +322,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
@@ -362,6 +388,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableImpl.java
index 869b9d7..db5e50e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VariableImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VariableImpl.java,v 1.28 2006/11/14 18:02:17 khussey Exp $
+ * $Id: VariableImpl.java,v 1.29 2006/12/14 15:49:30 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -37,6 +38,9 @@
 
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.ConnectorEnd;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.MultiplicityElement;
 import org.eclipse.uml2.uml.Namespace;
@@ -173,6 +177,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VARIABLE;
 	}
@@ -182,23 +187,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOwnedElements() {
+	public EList<Element> getOwnedElements() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList ownedElements = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			@SuppressWarnings("unchecked")
+			EList<Element> ownedElements = (EList<Element>) cache.get(
+				eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
 			if (ownedElements == null) {
 				cache.put(eResource, this,
 					UMLPackage.Literals.ELEMENT__OWNED_ELEMENT,
-					ownedElements = new DerivedUnionEObjectEList(Element.class,
-						this, UMLPackage.VARIABLE__OWNED_ELEMENT,
+					ownedElements = new DerivedUnionEObjectEList<Element>(
+						Element.class, this,
+						UMLPackage.VARIABLE__OWNED_ELEMENT,
 						OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList(Element.class, this,
+		return new DerivedUnionEObjectEList<Element>(Element.class, this,
 			UMLPackage.VARIABLE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
@@ -645,7 +652,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGt0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGt0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGt0(this,
 			diagnostics, context);
 	}
@@ -655,7 +663,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateLowerGe0(DiagnosticChain diagnostics, Map context) {
+	public boolean validateLowerGe0(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateLowerGe0(this,
 			diagnostics, context);
 	}
@@ -665,7 +674,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateUpperGeLower(DiagnosticChain diagnostics, Map context) {
+	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return MultiplicityElementOperations.validateUpperGeLower(this,
 			diagnostics, context);
 	}
@@ -676,7 +686,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
@@ -687,7 +697,7 @@
 	 * @generated
 	 */
 	public boolean validateValueSpecificationConstant(
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return MultiplicityElementOperations
 			.validateValueSpecificationConstant(this, diagnostics, context);
 	}
@@ -760,7 +770,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateOwned(DiagnosticChain diagnostics, Map context) {
+	public boolean validateOwned(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return VariableOperations.validateOwned(this, diagnostics, context);
 	}
 
@@ -778,15 +789,17 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VARIABLE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -801,7 +814,8 @@
 				return basicSetTemplateParameter((TemplateParameter) otherEnd,
 					msgs);
 			case UMLPackage.VARIABLE__END :
-				return ((InternalEList) getEnds()).basicAdd(otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEnds())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VARIABLE__SCOPE :
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -819,18 +833,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VARIABLE__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VARIABLE__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
@@ -838,7 +853,8 @@
 			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
 				return basicSetTemplateParameter(null, msgs);
 			case UMLPackage.VARIABLE__END :
-				return ((InternalEList) getEnds()).basicRemove(otherEnd, msgs);
+				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
+					msgs);
 			case UMLPackage.VARIABLE__UPPER_VALUE :
 				return basicSetUpperValue(null, msgs);
 			case UMLPackage.VARIABLE__LOWER_VALUE :
@@ -856,6 +872,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -879,6 +896,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
@@ -958,15 +976,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VARIABLE__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VARIABLE__NAME :
 				setName((String) newValue);
@@ -976,7 +998,8 @@
 				return;
 			case UMLPackage.VARIABLE__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VARIABLE__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -992,7 +1015,7 @@
 				return;
 			case UMLPackage.VARIABLE__END :
 				getEnds().clear();
-				getEnds().addAll((Collection) newValue);
+				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
 				return;
 			case UMLPackage.VARIABLE__IS_ORDERED :
 				setIsOrdered(((Boolean) newValue).booleanValue());
@@ -1027,6 +1050,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
@@ -1092,6 +1116,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VARIABLE__EANNOTATIONS :
@@ -1150,7 +1175,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
 				case UMLPackage.VARIABLE__IS_ORDERED :
@@ -1177,7 +1203,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
 				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
@@ -1204,6 +1231,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public String toString() {
 		if (eIsProxy())
 			return super.toString();
@@ -1235,6 +1263,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
 			|| eIsSet(UMLPackage.VARIABLE__UPPER_VALUE)
@@ -1264,6 +1293,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.VARIABLE__SCOPE)
 			|| eIsSet(UMLPackage.VARIABLE__ACTIVITY_SCOPE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VertexImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VertexImpl.java
index 80ebd46..c4de2e7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VertexImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/VertexImpl.java
@@ -8,17 +8,17 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VertexImpl.java,v 1.17 2006/11/14 18:02:19 khussey Exp $
+ * $Id: VertexImpl.java,v 1.18 2006/12/14 15:49:31 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
 import java.util.Collection;
-import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -28,6 +28,8 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Namespace;
 import org.eclipse.uml2.uml.Region;
 import org.eclipse.uml2.uml.StateMachine;
@@ -67,7 +69,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList outgoings = null;
+	protected EList<Transition> outgoings = null;
 
 	/**
 	 * The cached value of the '{@link #getIncomings() <em>Incoming</em>}' reference list.
@@ -77,7 +79,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList incomings = null;
+	protected EList<Transition> incomings = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -93,6 +95,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.VERTEX;
 	}
@@ -114,10 +117,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getOutgoings() {
+	public EList<Transition> getOutgoings() {
 		if (outgoings == null) {
-			outgoings = new EObjectWithInverseResolvingEList(Transition.class,
-				this, UMLPackage.VERTEX__OUTGOING,
+			outgoings = new EObjectWithInverseResolvingEList<Transition>(
+				Transition.class, this, UMLPackage.VERTEX__OUTGOING,
 				UMLPackage.TRANSITION__SOURCE);
 		}
 		return outgoings;
@@ -138,8 +141,7 @@
 	 * @generated
 	 */
 	public Transition getOutgoing(String name, boolean ignoreCase, EClass eClass) {
-		outgoingLoop : for (Iterator i = getOutgoings().iterator(); i.hasNext();) {
-			Transition outgoing = (Transition) i.next();
+		outgoingLoop : for (Transition outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
 			if (name != null && !(ignoreCase
@@ -156,10 +158,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getIncomings() {
+	public EList<Transition> getIncomings() {
 		if (incomings == null) {
-			incomings = new EObjectWithInverseResolvingEList(Transition.class,
-				this, UMLPackage.VERTEX__INCOMING,
+			incomings = new EObjectWithInverseResolvingEList<Transition>(
+				Transition.class, this, UMLPackage.VERTEX__INCOMING,
 				UMLPackage.TRANSITION__TARGET);
 		}
 		return incomings;
@@ -180,8 +182,7 @@
 	 * @generated
 	 */
 	public Transition getIncoming(String name, boolean ignoreCase, EClass eClass) {
-		incomingLoop : for (Iterator i = getIncomings().iterator(); i.hasNext();) {
-			Transition incoming = (Transition) i.next();
+		incomingLoop : for (Transition incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
 			if (name != null && !(ignoreCase
@@ -269,20 +270,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicAdd(otherEnd,
-					msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VERTEX__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicAdd(
-					otherEnd, msgs);
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getClientDependencies())
+					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VERTEX__OUTGOING :
-				return ((InternalEList) getOutgoings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VERTEX__INCOMING :
-				return ((InternalEList) getIncomings())
+				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
 					.basicAdd(otherEnd, msgs);
 			case UMLPackage.VERTEX__CONTAINER :
 				if (eInternalContainer() != null)
@@ -297,26 +300,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VERTEX__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.VERTEX__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.VERTEX__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.VERTEX__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VERTEX__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.VERTEX__CONTAINER :
 				return basicSetContainer(null, msgs);
 		}
@@ -328,6 +332,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID) {
@@ -343,6 +348,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
@@ -388,15 +394,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.VERTEX__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.VERTEX__NAME :
 				setName((String) newValue);
@@ -406,18 +416,21 @@
 				return;
 			case UMLPackage.VERTEX__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.VERTEX__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
 				return;
 			case UMLPackage.VERTEX__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.VERTEX__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends Transition>) newValue);
 				return;
 			case UMLPackage.VERTEX__CONTAINER :
 				setContainer((Region) newValue);
@@ -431,6 +444,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
@@ -469,6 +483,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.VERTEX__EANNOTATIONS :
@@ -523,6 +538,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace() || eIsSet(UMLPackage.VERTEX__CONTAINER);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteLinkActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteLinkActionImpl.java
index cf8fd1a..b544c4c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteLinkActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteLinkActionImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteLinkActionImpl.java,v 1.2 2005/11/23 20:01:14 khussey Exp $
+ * $Id: WriteLinkActionImpl.java,v 1.3 2006/12/14 15:49:28 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -50,6 +50,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.WRITE_LINK_ACTION;
 	}
@@ -59,7 +60,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateAllowAccess(DiagnosticChain diagnostics, Map context) {
+	public boolean validateAllowAccess(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return WriteLinkActionOperations.validateAllowAccess(this, diagnostics,
 			context);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteStructuralFeatureActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteStructuralFeatureActionImpl.java
index 45fa4c0..af471a3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteStructuralFeatureActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteStructuralFeatureActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteStructuralFeatureActionImpl.java,v 1.22 2006/11/14 18:02:16 khussey Exp $
+ * $Id: WriteStructuralFeatureActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuralFeature;
 import org.eclipse.uml2.uml.StructuredActivityNode;
@@ -88,6 +97,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION;
 	}
@@ -97,22 +107,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList(InputPin.class, this,
+					inputs = new DerivedUnionEObjectEList<InputPin>(
+						InputPin.class, this,
 						UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT,
 						INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -237,7 +249,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateInputPin(DiagnosticChain diagnostics, Map context) {
+	public boolean validateInputPin(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return WriteStructuralFeatureActionOperations.validateInputPin(this,
 			diagnostics, context);
 	}
@@ -247,7 +260,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return WriteStructuralFeatureActionOperations.validateMultiplicity(
 			this, diagnostics, context);
 	}
@@ -257,18 +271,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
@@ -276,26 +291,26 @@
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
 				return basicSetObject(null, msgs);
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
@@ -309,6 +324,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -400,15 +416,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME :
 				setName((String) newValue);
@@ -418,7 +438,8 @@
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -434,35 +455,44 @@
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
 				setStructuralFeature((StructuralFeature) newValue);
@@ -482,6 +512,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -553,6 +584,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
@@ -642,6 +674,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteVariableActionImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteVariableActionImpl.java
index 9988c7b..839e08a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteVariableActionImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/WriteVariableActionImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteVariableActionImpl.java,v 1.22 2006/11/14 18:02:18 khussey Exp $
+ * $Id: WriteVariableActionImpl.java,v 1.23 2006/12/14 15:49:29 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.impl;
 
@@ -22,6 +22,7 @@
 
 import org.eclipse.emf.common.util.EList;
 
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -35,7 +36,15 @@
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
 import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityEdge;
+import org.eclipse.uml2.uml.ActivityNode;
+import org.eclipse.uml2.uml.ActivityPartition;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.ExceptionHandler;
 import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.InterruptibleActivityRegion;
 import org.eclipse.uml2.uml.StringExpression;
 import org.eclipse.uml2.uml.StructuredActivityNode;
 import org.eclipse.uml2.uml.Type;
@@ -88,6 +97,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EClass eStaticClass() {
 		return UMLPackage.Literals.WRITE_VARIABLE_ACTION;
 	}
@@ -97,23 +107,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList getInputs() {
+	public EList<InputPin> getInputs() {
 
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
-			EList inputs = (EList) cache.get(eResource, this,
-				UMLPackage.Literals.ACTION__INPUT);
+			@SuppressWarnings("unchecked")
+			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
+				this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache
 					.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-						inputs = new DerivedUnionEObjectEList(InputPin.class,
-							this, UMLPackage.WRITE_VARIABLE_ACTION__INPUT,
+						inputs = new DerivedUnionEObjectEList<InputPin>(
+							InputPin.class, this,
+							UMLPackage.WRITE_VARIABLE_ACTION__INPUT,
 							INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList(InputPin.class, this,
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
 			UMLPackage.WRITE_VARIABLE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
@@ -232,7 +244,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateSameType(DiagnosticChain diagnostics, Map context) {
+	public boolean validateSameType(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return WriteVariableActionOperations.validateSameType(this,
 			diagnostics, context);
 	}
@@ -242,7 +255,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validateMultiplicity(DiagnosticChain diagnostics, Map context) {
+	public boolean validateMultiplicity(DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return WriteVariableActionOperations.validateMultiplicity(this,
 			diagnostics, context);
 	}
@@ -252,18 +266,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				return ((InternalEList) getEAnnotations()).basicRemove(
+				return ((InternalEList<?>) getEAnnotations()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				return ((InternalEList) getOwnedComments()).basicRemove(
+				return ((InternalEList<?>) getOwnedComments()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return ((InternalEList) getClientDependencies()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getClientDependencies())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
 				return basicSetNameExpression(null, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
@@ -271,26 +286,26 @@
 			case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY :
 				return basicSetActivity(null, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				return ((InternalEList) getOutgoings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getOutgoings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				return ((InternalEList) getIncomings()).basicRemove(otherEnd,
-					msgs);
+				return ((InternalEList<?>) getIncomings()).basicRemove(
+					otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				return ((InternalEList) getInPartitions()).basicRemove(
+				return ((InternalEList<?>) getInPartitions()).basicRemove(
 					otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList) getInInterruptibleRegions())
+				return ((InternalEList<?>) getInInterruptibleRegions())
 					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				return ((InternalEList) getHandlers()).basicRemove(otherEnd,
+				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
 					msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList) getLocalPreconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPreconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList) getLocalPostconditions()).basicRemove(
-					otherEnd, msgs);
+				return ((InternalEList<?>) getLocalPostconditions())
+					.basicRemove(otherEnd, msgs);
 			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
 				return basicSetValue(null, msgs);
 		}
@@ -302,6 +317,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
@@ -389,15 +405,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
+	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
 				getEAnnotations().clear();
-				getEAnnotations().addAll((Collection) newValue);
+				getEAnnotations().addAll(
+					(Collection<? extends EAnnotation>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
 				getOwnedComments().clear();
-				getOwnedComments().addAll((Collection) newValue);
+				getOwnedComments().addAll(
+					(Collection<? extends Comment>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__NAME :
 				setName((String) newValue);
@@ -407,7 +427,8 @@
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY :
 				getClientDependencies().clear();
-				getClientDependencies().addAll((Collection) newValue);
+				getClientDependencies().addAll(
+					(Collection<? extends Dependency>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
 				setNameExpression((StringExpression) newValue);
@@ -423,35 +444,44 @@
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
 				getOutgoings().clear();
-				getOutgoings().addAll((Collection) newValue);
+				getOutgoings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
 				getIncomings().clear();
-				getIncomings().addAll((Collection) newValue);
+				getIncomings().addAll(
+					(Collection<? extends ActivityEdge>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
 				getInPartitions().clear();
-				getInPartitions().addAll((Collection) newValue);
+				getInPartitions().addAll(
+					(Collection<? extends ActivityPartition>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
 				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll((Collection) newValue);
+				getInInterruptibleRegions()
+					.addAll(
+						(Collection<? extends InterruptibleActivityRegion>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE :
 				getRedefinedNodes().clear();
-				getRedefinedNodes().addAll((Collection) newValue);
+				getRedefinedNodes().addAll(
+					(Collection<? extends ActivityNode>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
 				getHandlers().clear();
-				getHandlers().addAll((Collection) newValue);
+				getHandlers().addAll(
+					(Collection<? extends ExceptionHandler>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
 				getLocalPreconditions().clear();
-				getLocalPreconditions().addAll((Collection) newValue);
+				getLocalPreconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
 				getLocalPostconditions().clear();
-				getLocalPostconditions().addAll((Collection) newValue);
+				getLocalPostconditions().addAll(
+					(Collection<? extends Constraint>) newValue);
 				return;
 			case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE :
 				setVariable((Variable) newValue);
@@ -468,6 +498,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
@@ -536,6 +567,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
@@ -621,6 +653,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
 			|| eIsSet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/uml.ecore b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/uml.ecore
index e6f283d..515b85a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/uml.ecore
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/impl/uml.ecore
@@ -20,11 +20,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true" eSuperTypes="http://www.eclipse.org/emf/2002/Ecore#//EModelElement">
     <eOperations name="not_own_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_owner" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="destroy" ordered="false" lowerBound="1"/>
     <eOperations name="hasKeyword" ordered="false" lowerBound="1" eType="#//Boolean">
@@ -136,7 +146,12 @@
     </eAnnotations>
     <eOperations name="elements_public_or_private" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedClass" ordered="false" lowerBound="1" eType="#//Class">
       <eParameters name="name" ordered="false" lowerBound="1" eType="#//String"/>
@@ -222,15 +237,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true" eSuperTypes="#//Element">
     <eOperations name="has_no_qualified_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_qualified_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility_needs_ownership" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createDependency" ordered="false" lowerBound="1" eType="#//Dependency">
       <eParameters name="supplier" ordered="false" lowerBound="1" eType="#//NamedElement"/>
@@ -307,7 +337,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Namespace" abstract="true" eSuperTypes="#//NamedElement">
     <eOperations name="members_distinguishable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createElementImport" ordered="false" lowerBound="1" eType="#//ElementImport">
       <eParameters name="element" ordered="false" lowerBound="1" eType="#//PackageableElement"/>
@@ -362,11 +397,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ElementImport" eSuperTypes="#//DirectedRelationship">
     <eOperations name="visibility_public_or_private" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="imported_element_is_public" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getName" ordered="false" lowerBound="1" eType="#//String"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="visibility" ordered="false"
@@ -385,7 +430,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="PackageImport" eSuperTypes="#//DirectedRelationship">
     <eOperations name="public_or_private" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="visibility" ordered="false"
         lowerBound="1" eType="#//VisibilityKind" defaultValueLiteral="public"/>
@@ -401,23 +451,48 @@
   <eClassifiers xsi:type="ecore:EClass" name="Constraint" eSuperTypes="#//PackageableElement">
     <eOperations name="not_apply_to_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_boolean" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="boolean_value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_side_effects" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_applied_to_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="constrainedElement" upperBound="-1"
         eType="#//Element"/>
@@ -475,19 +550,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="Association" eSuperTypes="#//Classifier #//Relationship">
     <eOperations name="specialized_end_number" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="specialized_end_types" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binary_associations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_ends" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isBinary" ordered="false" lowerBound="1" eType="#//Boolean"/>
     <eOperations name="getEndTypes" upperBound="-1" eType="#//Type"/>
@@ -529,19 +624,39 @@
     </eAnnotations>
     <eOperations name="no_cycles_in_generalization" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="generalization_hierarchies" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="specialize_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maps_to_generalization_set" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getAllAttributes" ordered="false" upperBound="-1" eType="#//Property"/>
     <eOperations name="getOperations" ordered="false" upperBound="-1" eType="#//Operation"/>
@@ -634,11 +749,21 @@
       eSuperTypes="#//NamedElement">
     <eOperations name="redefinition_context_valid" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinition_consistent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isConsistentWith" ordered="false" lowerBound="1" eType="#//Boolean">
       <eParameters name="redefinee" ordered="false" lowerBound="1" eType="#//RedefinableElement"/>
@@ -676,11 +801,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="TemplateBinding" eSuperTypes="#//DirectedRelationship">
     <eOperations name="parameter_substitution_formal" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_parameter_substitution" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signature" ordered="false"
         lowerBound="1" eType="#//TemplateSignature">
@@ -699,7 +834,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="TemplateSignature" eSuperTypes="#//Element">
     <eOperations name="own_elements" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" lowerBound="1"
         upperBound="-1" eType="#//TemplateParameter"/>
@@ -715,7 +855,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="TemplateParameter" eSuperTypes="#//Element">
     <eOperations name="must_be_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signature" ordered="false"
         lowerBound="1" eType="#//TemplateSignature" eOpposite="#//TemplateSignature/ownedParameter">
@@ -750,7 +895,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="TemplateParameterSubstitution" eSuperTypes="#//Element">
     <eOperations name="must_be_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="formal" ordered="false"
         lowerBound="1" eType="#//TemplateParameter"/>
@@ -768,7 +918,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Generalization" eSuperTypes="#//DirectedRelationship">
     <eOperations name="generalization_same_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubstitutable" ordered="false"
         eType="#//Boolean" unsettable="true"/>
@@ -786,11 +941,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="GeneralizationSet" eSuperTypes="#//PackageableElement">
     <eOperations name="generalization_same_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maps_to_generalization_set" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isCovering" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -836,15 +1001,30 @@
     </eAnnotations>
     <eOperations name="language_body_size" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="only_return_result_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_return_result_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getResult" ordered="false" eType="#//Parameter"/>
     <eOperations name="value" ordered="false" lowerBound="1" eType="#//Integer"/>
@@ -867,23 +1047,48 @@
   <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//ConnectableElement #//MultiplicityElement">
     <eOperations name="connector_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="stream_and_exception" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_exception" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="reentrant_behaviors" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="in_and_out" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefault" ordered="false" eType="#//String"/>
     <eOperations name="isSetDefault" ordered="false" lowerBound="1" eType="#//Boolean"/>
@@ -929,23 +1134,48 @@
       eSuperTypes="#//Element">
     <eOperations name="upper_gt_0" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="lower_ge_0" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="upper_ge_lower" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_no_side_effects" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="value_specification_constant" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="setLower" ordered="false" lowerBound="1">
       <eParameters name="newLower" ordered="false" lowerBound="1" eType="#//Integer"/>
@@ -1004,19 +1234,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ConnectorEnd" eSuperTypes="#//MultiplicityElement">
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="part_with_port_empty" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="role_and_part_with_port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="self_part_with_port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefiningEnd" ordered="false" lowerBound="1" eType="#//Property"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="definingEnd" ordered="false"
@@ -1045,43 +1295,93 @@
     </eAnnotations>
     <eOperations name="multiplicity_of_composite" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetting_context_conforms" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefined_property_inherited" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetting_rules" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="navigable_readonly" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="derived_union_is_derived" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="derived_union_is_read_only" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subsetted_property_names" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binding_to_attribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getDefault" ordered="false" eType="#//String"/>
     <eOperations name="isSetDefault" ordered="false" lowerBound="1" eType="#//Boolean"/>
@@ -1193,11 +1493,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="DeploymentSpecification" eSuperTypes="#//Artifact">
     <eOperations name="deployed_elements" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="deploymentLocation" ordered="false"
         eType="#//String" unsettable="true"/>
@@ -1266,11 +1576,21 @@
     </eAnnotations>
     <eOperations name="at_most_one_return" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="only_body_for_query" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getLower" ordered="false" lowerBound="1" eType="#//Integer"/>
     <eOperations name="getUpper" ordered="false" lowerBound="1" eType="#//UnlimitedNatural"/>
@@ -1374,19 +1694,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="Behavior" abstract="true" eSuperTypes="#//Class">
     <eOperations name="parameters_match" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="feature_of_context_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_realize" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="most_one_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getContext" ordered="false" eType="#//BehavioredClassifier"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReentrant" ordered="false"
@@ -1434,7 +1774,12 @@
     </eAnnotations>
     <eOperations name="passive_class" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getExtensions" ordered="false" upperBound="-1" eType="#//Extension"/>
     <eOperations name="createOwnedOperation" ordered="false" lowerBound="1" eType="#//Operation">
@@ -1470,7 +1815,12 @@
       eSuperTypes="#//Classifier">
     <eOperations name="class_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getImplementedInterfaces" ordered="false" upperBound="-1" eType="#//Interface"/>
     <eOperations name="getAllImplementedInterfaces" ordered="false" upperBound="-1"
@@ -1505,7 +1855,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Interface" eSuperTypes="#//Classifier">
     <eOperations name="visibility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedOperation" ordered="false" lowerBound="1" eType="#//Operation">
       <eParameters name="name" ordered="false" eType="#//String"/>
@@ -1547,7 +1902,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Reception" eSuperTypes="#//BehavioralFeature">
     <eOperations name="not_query" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signal" ordered="false"
         eType="#//Signal"/>
@@ -1569,24 +1929,49 @@
       <contents xsi:type="ecore:EOperation" name="classifier_context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//StateMachine/classifier_context"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="protocol_transitions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="entry_exit_do" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deep_or_shallow_history" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ports_connected" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="conformance" ordered="false"
         upperBound="-1" eType="#//ProtocolConformance" containment="true" eOpposite="#//ProtocolConformance/specificMachine">
@@ -1603,19 +1988,39 @@
     </eAnnotations>
     <eOperations name="classifier_context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="context_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="connection_points" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="method" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="LCA" ordered="false" lowerBound="1" eType="#//Namespace">
       <eParameters name="s1" ordered="false" lowerBound="1" eType="#//State"/>
@@ -1660,19 +2065,39 @@
     </eAnnotations>
     <eOperations name="initial_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deep_history_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="shallow_history_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinitionContext" ordered="false" lowerBound="1" eType="#//Classifier"/>
     <eOperations name="isRedefinitionContextValid" ordered="false" lowerBound="1"
@@ -1729,31 +2154,66 @@
     </eAnnotations>
     <eOperations name="fork_segment_guards" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_segment_guards" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="fork_segment_state" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_segment_state" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="outgoing_pseudostates" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="initial_transition" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signatures_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="redefinitionContext" ordered="false" lowerBound="1" eType="#//Classifier"/>
     <eOperations name="containingStateMachine" ordered="false" lowerBound="1" eType="#//StateMachine"/>
@@ -1800,19 +2260,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="Port" eSuperTypes="#//Property">
     <eOperations name="required_interfaces" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="port_aggregation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="port_destroyed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="default_value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getProvideds" ordered="false" upperBound="-1" eType="#//Interface"/>
     <eOperations name="getRequireds" ordered="false" upperBound="-1" eType="#//Interface"/>
@@ -1852,23 +2332,48 @@
     </eAnnotations>
     <eOperations name="submachine_states" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="destinations_or_sources_of_transitions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="submachine_or_regions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="composite_states" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="entry_or_exit" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isSimple" ordered="false" lowerBound="1" eType="#//Boolean"/>
     <eOperations name="isComposite" ordered="false" lowerBound="1" eType="#//Boolean"/>
@@ -1932,11 +2437,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ConnectionPointReference" eSuperTypes="#//Vertex">
     <eOperations name="entry_pseudostates" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="exit_pseudostates" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="entry" ordered="false"
         upperBound="-1" eType="#//Pseudostate"/>
@@ -1950,39 +2465,84 @@
   <eClassifiers xsi:type="ecore:EClass" name="Pseudostate" eSuperTypes="#//Vertex">
     <eOperations name="initial_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="history_vertices" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="join_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transitions_incoming" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="fork_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transitions_outgoing" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="junction_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="choice_vertex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="outgoing_from_initial" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" ordered="false" lowerBound="1"
         eType="#//PseudostateKind" defaultValueLiteral="initial"/>
@@ -2028,7 +2588,12 @@
       eSuperTypes="#//Classifier">
     <eOperations name="multiplicities" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createOwnedAttribute" ordered="false" lowerBound="1" eType="#//Property">
       <eParameters name="name" ordered="false" eType="#//String"/>
@@ -2056,35 +2621,75 @@
   <eClassifiers xsi:type="ecore:EClass" name="Connector" eSuperTypes="#//Feature">
     <eOperations name="types" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="roles" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interfaces_ports" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interface_port_implements" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="between_interface_port_signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="union_signature_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="assembly_connector" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" eType="#//Association"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="redefinedConnector" ordered="false"
@@ -2113,11 +2718,21 @@
     </eAnnotations>
     <eOperations name="non_owned_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="is_binary" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getStereotypeEnd" ordered="false" eType="#//Property"/>
     <eOperations name="getStereotype" ordered="false" eType="#//Stereotype"/>
@@ -2155,21 +2770,41 @@
     </eAnnotations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="aggregation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Stereotype" eSuperTypes="#//Class">
     <eOperations name="name_not_clash" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="generalize" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="createExtension" ordered="false" lowerBound="1" eType="#//Extension">
       <eParameters name="metaclass" ordered="false" lowerBound="1" eType="#//Class"/>
@@ -2205,11 +2840,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="Profile" eSuperTypes="#//Package">
     <eOperations name="metaclass_reference_not_specialized" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="references_same_metamodel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="create" ordered="false" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject">
       <eParameters name="classifier" ordered="false" lowerBound="1" eType="#//Classifier"/>
@@ -2250,15 +2895,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ParameterSet" eSuperTypes="#//NamedElement">
     <eOperations name="same_parameterized_entity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="two_parameter_sets" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" ordered="false"
         lowerBound="1" upperBound="-1" eType="#//Parameter" eOpposite="#//Parameter/parameterSet"/>
@@ -2342,15 +3002,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="CollaborationUse" eSuperTypes="#//NamedElement">
     <eOperations name="client_elements" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="every_role" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="connectors" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1"
         eType="#//Collaboration"/>
@@ -2368,19 +3043,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="UseCase" eSuperTypes="#//BehavioredClassifier">
     <eOperations name="must_have_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="binary_associations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_association_to_use_case" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_include_self" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="allIncludedUseCases" ordered="false" upperBound="-1" eType="#//UseCase"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="include" ordered="false"
@@ -2411,7 +3106,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Extend" eSuperTypes="#//NamedElement #//DirectedRelationship">
     <eOperations name="extension_points" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="extendedCase" ordered="false"
         lowerBound="1" eType="#//UseCase">
@@ -2431,7 +3131,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="ExtensionPoint" eSuperTypes="#//RedefinableElement">
     <eOperations name="must_have_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="useCase" ordered="false"
         lowerBound="1" eType="#//UseCase" eOpposite="#//UseCase/extensionPoint"/>
@@ -2446,7 +3151,12 @@
     </eAnnotations>
     <eOperations name="inherited_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getInheritedParameters" ordered="false" upperBound="-1" eType="#//TemplateParameter"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="extendedSignature" ordered="false"
@@ -2472,7 +3182,12 @@
     </eAnnotations>
     <eOperations name="has_constraining_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="allowSubstitutable" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true"/>
@@ -2490,11 +3205,21 @@
     </eAnnotations>
     <eOperations name="operands" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="subexpressions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="subExpression" ordered="false"
         upperBound="-1" eType="#//StringExpression" containment="true" eOpposite="#//StringExpression/owningExpression">
@@ -2554,19 +3279,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="InstanceSpecification" eSuperTypes="#//DeploymentTarget #//PackageableElement #//DeployedArtifact">
     <eOperations name="defining_feature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structural_feature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="deployment_artifact" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="classifier" ordered="false"
         upperBound="-1" eType="#//Classifier"/>
@@ -2705,11 +3450,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="FunctionBehavior" eSuperTypes="#//OpaqueBehavior">
     <eOperations name="one_output_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="types_of_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="OpaqueAction" eSuperTypes="#//Action">
@@ -2762,11 +3517,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActivityNode" abstract="true" eSuperTypes="#//RedefinableElement">
     <eOperations name="owned_structured_node" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="inStructuredNode" ordered="false"
         eType="#//StructuredActivityNode" eOpposite="#//StructuredActivityNode/node">
@@ -2807,7 +3572,12 @@
     </eAnnotations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false"
         upperBound="-1" eType="#//Variable" containment="true" eOpposite="#//Variable/scope">
@@ -2827,15 +3597,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActivityGroup" abstract="true" eSuperTypes="#//Element">
     <eOperations name="nodes_and_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="group_owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="subgroup" ordered="false"
         upperBound="-1" eType="#//ActivityGroup" changeable="false" volatile="true"
@@ -2867,15 +3652,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="Activity" eSuperTypes="#//Behavior">
     <eOperations name="no_supergroups" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="activity_parameter_node" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="autonomous" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="structuredNode" ordered="false"
         upperBound="-1" eType="#//StructuredActivityNode" changeable="false" volatile="true"
@@ -2910,7 +3710,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Variable" eSuperTypes="#//ConnectableElement #//MultiplicityElement">
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="isAccessibleBy" ordered="false" lowerBound="1" eType="#//Boolean">
       <eParameters name="a" ordered="false" lowerBound="1" eType="#//Action"/>
@@ -2927,15 +3732,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActivityEdge" abstract="true" eSuperTypes="#//RedefinableElement">
     <eOperations name="source_and_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="owned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structured_node" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="source" ordered="false"
         lowerBound="1" eType="#//ActivityNode" eOpposite="#//ActivityNode/outgoing"/>
@@ -2976,19 +3796,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActivityPartition" eSuperTypes="#//NamedElement #//ActivityGroup">
     <eOperations name="dimension_not_contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_part" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="represents_part_and_is_contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDimension" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -3016,7 +3856,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="InterruptibleActivityRegion" eSuperTypes="#//ActivityGroup">
     <eOperations name="interrupting_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="node" ordered="false" upperBound="-1"
         eType="#//ActivityNode" eOpposite="#//ActivityNode/inInterruptibleRegion">
@@ -3028,19 +3873,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ExceptionHandler" eSuperTypes="#//Element">
     <eOperations name="exception_body" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_input" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edge_source_target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="handlerBody" ordered="false"
         lowerBound="1" eType="#//ExecutableNode"/>
@@ -3056,19 +3921,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ObjectNode" abstract="true" eSuperTypes="#//ActivityNode #//TypedElement">
     <eOperations name="object_flow_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_unique" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selection_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_output_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="ordering" ordered="false"
         lowerBound="1" eType="#//ObjectNodeOrderingKind" defaultValueLiteral="FIFO"/>
@@ -3092,13 +3977,23 @@
   <eClassifiers xsi:type="ecore:EClass" name="OutputPin" eSuperTypes="#//Pin">
     <eOperations name="incoming_edges_structured_only" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Pin" eSuperTypes="#//ObjectNode #//MultiplicityElement">
     <eOperations name="control_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isControl" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -3106,21 +4001,41 @@
   <eClassifiers xsi:type="ecore:EClass" name="InputPin" eSuperTypes="#//Pin">
     <eOperations name="outgoing_edges_structured_only" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CallAction" abstract="true" eSuperTypes="#//InvocationAction">
     <eOperations name="synchronous_call" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="number_and_order" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronous" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true"/>
@@ -3132,7 +4047,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="InvocationAction" abstract="true" eSuperTypes="#//Action">
     <eOperations name="on_port_receiver" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="argument" upperBound="-1"
         eType="#//InputPin" containment="true">
@@ -3144,11 +4064,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="SendSignalAction" eSuperTypes="#//InvocationAction">
     <eOperations name="number_order" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="target" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -3162,20 +4092,40 @@
       <contents xsi:type="ecore:EOperation" name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//CallAction/type_ordering_multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="argument_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_target_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="operation" ordered="false"
         lowerBound="1" eType="#//Operation"/>
@@ -3189,16 +4139,31 @@
       <contents xsi:type="ecore:EOperation" name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//CallAction/type_ordering_multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="argument_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_pin_equal_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" ordered="false"
         lowerBound="1" eType="#//Behavior"/>
@@ -3214,39 +4179,79 @@
   <eClassifiers xsi:type="ecore:EClass" name="ControlFlow" eSuperTypes="#//ActivityEdge">
     <eOperations name="object_nodes" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InitialNode" eSuperTypes="#//ControlNode">
     <eOperations name="no_incoming_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="control_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ActivityParameterNode" eSuperTypes="#//ObjectNode">
     <eOperations name="has_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_incoming_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_outgoing_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" ordered="false"
         lowerBound="1" eType="#//Parameter"/>
@@ -3254,11 +4259,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ValuePin" eSuperTypes="#//InputPin">
     <eOperations name="compatible_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_incoming_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//ValueSpecification" containment="true"/>
@@ -3266,31 +4281,66 @@
   <eClassifiers xsi:type="ecore:EClass" name="Message" eSuperTypes="#//NamedElement">
     <eOperations name="sending_receiving_message_event" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_refer_to" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_is_operation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="signature_is_signal" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_cross_boundaries" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="occurrence_specifications" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="getMessageKind" ordered="false" lowerBound="1" eType="#//MessageKind"/>
     <eOperations name="getSignature" ordered="false" eType="#//NamedElement"/>
@@ -3375,15 +4425,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="Lifeline" eSuperTypes="#//NamedElement">
     <eOperations name="interaction_uses_share_lifeline" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selector_specified" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="represents" ordered="false"
         eType="#//ConnectableElement"/>
@@ -3403,33 +4468,68 @@
   <eClassifiers xsi:type="ecore:EClass" name="PartDecomposition" eSuperTypes="#//InteractionUse">
     <eOperations name="parts_of_internal_structures" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="assume" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="commutativity_of_decomposition" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InteractionUse" eSuperTypes="#//InteractionFragment">
     <eOperations name="gates_match" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="all_lifelines" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments_correspond_to_parameters" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="arguments_are_constants" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="refersTo" ordered="false"
         lowerBound="1" eType="#//Interaction"/>
@@ -3443,11 +4543,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="Gate" eSuperTypes="#//MessageEnd">
     <eOperations name="messages_actual_gate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="messages_combined_fragment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="GeneralOrdering" eSuperTypes="#//NamedElement">
@@ -3473,11 +4583,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="InteractionOperand" eSuperTypes="#//Namespace #//InteractionFragment">
     <eOperations name="guard_directly_prior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="guard_contain_references" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="guard" ordered="false"
         eType="#//InteractionConstraint" containment="true">
@@ -3491,27 +4611,57 @@
   <eClassifiers xsi:type="ecore:EClass" name="InteractionConstraint" eSuperTypes="#//Constraint">
     <eOperations name="dynamic_variables" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="global_data" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_maxint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_non_negative" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maxint_positive" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="maxint_greater_equal_minint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="minint" ordered="false"
         eType="#//ValueSpecification" containment="true">
@@ -3526,7 +4676,12 @@
       eSuperTypes="#//InteractionFragment">
     <eOperations name="same_lifeline" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="start" ordered="false"
         lowerBound="1" eType="#//OccurrenceSpecification"/>
@@ -3548,7 +4703,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActionExecutionSpecification" eSuperTypes="#//ExecutionSpecification">
     <eOperations name="action_referenced" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="action" ordered="false"
         lowerBound="1" eType="#//Action"/>
@@ -3561,13 +4721,23 @@
   <eClassifiers xsi:type="ecore:EClass" name="CreationEvent" eSuperTypes="#//Event">
     <eOperations name="no_occurrence_above" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DestructionEvent" eSuperTypes="#//Event">
     <eOperations name="no_occurrence_specifications_below" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="SendOperationEvent" eSuperTypes="#//MessageEvent">
@@ -3601,11 +4771,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="Actor" eSuperTypes="#//BehavioredClassifier">
     <eOperations name="associations" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_have_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CallEvent" eSuperTypes="#//MessageEvent">
@@ -3626,43 +4806,83 @@
   <eClassifiers xsi:type="ecore:EClass" name="ForkNode" eSuperTypes="#//ControlNode">
     <eOperations name="one_incoming_edge" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FlowFinalNode" eSuperTypes="#//FinalNode"/>
   <eClassifiers xsi:type="ecore:EClass" name="FinalNode" abstract="true" eSuperTypes="#//ControlNode">
     <eOperations name="no_outgoing_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CentralBufferNode" eSuperTypes="#//ObjectNode"/>
   <eClassifiers xsi:type="ecore:EClass" name="MergeNode" eSuperTypes="#//ControlNode">
     <eOperations name="one_outgoing_edge" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DecisionNode" eSuperTypes="#//ControlNode">
     <eOperations name="one_incoming_edge" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="decisionInput" ordered="false"
         eType="#//Behavior"/>
@@ -3720,7 +4940,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="Node" eSuperTypes="#//Class #//DeploymentTarget">
     <eOperations name="internal_structure" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="nestedNode" ordered="false"
         upperBound="-1" eType="#//Node" containment="true">
@@ -3734,26 +4959,51 @@
       <contents xsi:type="ecore:EOperation" name="association_ends" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//Association/association_ends"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CombinedFragment" eSuperTypes="#//InteractionFragment">
     <eOperations name="opt_loop_break_neg" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="minint_and_maxint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="break" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="consider_and_ignore" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="interactionOperator" ordered="false"
         lowerBound="1" eType="#//InteractionOperatorKind" defaultValueLiteral="seq"/>
@@ -3783,15 +5033,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="Continuation" eSuperTypes="#//InteractionFragment">
     <eOperations name="same_name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="global" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="first_or_last_interaction_fragment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="setting" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true"/>
@@ -3799,11 +5064,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ConsiderIgnoreFragment" eSuperTypes="#//CombinedFragment">
     <eOperations name="consider_or_ignore" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false"
         upperBound="-1" eType="#//NamedElement"/>
@@ -3811,19 +5086,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="CreateObjectAction" eSuperTypes="#//Action">
     <eOperations name="classifier_not_abstract" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="classifier_not_association_class" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="classifier" ordered="false"
         lowerBound="1" eType="#//Classifier"/>
@@ -3835,11 +5130,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="DestroyObjectAction" eSuperTypes="#//Action">
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDestroyLinks" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -3853,15 +5158,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="TestIdentityAction" eSuperTypes="#//Action">
     <eOperations name="no_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_is_boolean" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="first" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -3879,19 +5199,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadSelfAction" eSuperTypes="#//Action">
     <eOperations name="contained" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_static" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -3902,23 +5242,48 @@
       eSuperTypes="#//Action">
     <eOperations name="not_static" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="one_featuring_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="structuralFeature" ordered="false"
         lowerBound="1" eType="#//StructuralFeature"/>
@@ -3932,12 +5297,22 @@
       <contents xsi:type="ecore:EOperation" name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//StructuralFeatureAction/multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -3950,12 +5325,22 @@
       <contents xsi:type="ecore:EOperation" name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
         <eAnnotations source="redefines" references="#//StructuralFeatureAction/multiplicity"/>
         <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-        <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+        <eParameters name="context">
+          <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+            <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          </eGenericType>
+        </eParameters>
       </contents>
     </eAnnotations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -3967,7 +5352,12 @@
       eSuperTypes="#//WriteStructuralFeatureAction">
     <eOperations name="non_unique_removal" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRemoveDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -3979,7 +5369,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="AddStructuralFeatureValueAction" eSuperTypes="#//WriteStructuralFeatureAction">
     <eOperations name="unlimited_natural_and_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -3991,15 +5386,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="LinkAction" abstract="true" eSuperTypes="#//Action">
     <eOperations name="same_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_static" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association" ordered="false" lowerBound="1" eType="#//Association"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="endData" ordered="false"
@@ -4012,23 +5422,48 @@
   <eClassifiers xsi:type="ecore:EClass" name="LinkEndData" eSuperTypes="#//Element">
     <eOperations name="property_is_association_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="qualifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="end_object_input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         eType="#//InputPin"/>
@@ -4040,15 +5475,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="QualifierValue" eSuperTypes="#//Element">
     <eOperations name="qualifier_attribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="qualifier" ordered="false"
         lowerBound="1" eType="#//Property"/>
@@ -4058,23 +5508,48 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadLinkAction" eSuperTypes="#//LinkAction">
     <eOperations name="one_open_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="navigable_open_end" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="visibility" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -4084,11 +5559,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="LinkEndCreationData" eSuperTypes="#//LinkEndData">
     <eOperations name="create_link_action" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="single_input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4104,13 +5589,23 @@
     </eAnnotations>
     <eOperations name="association_not_abstract" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="WriteLinkAction" abstract="true" eSuperTypes="#//LinkAction">
     <eOperations name="allow_access" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DestroyLinkAction" eSuperTypes="#//WriteLinkAction">
@@ -4124,11 +5619,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="LinkEndDestructionData" eSuperTypes="#//LinkEndData">
     <eOperations name="destroy_link_action" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unlimited_natural_and_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDestroyDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4138,11 +5643,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ClearAssociationAction" eSuperTypes="#//Action">
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -4154,11 +5669,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="BroadcastSignalAction" eSuperTypes="#//InvocationAction">
     <eOperations name="number_and_order" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_ordering_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="signal" ordered="false"
         lowerBound="1" eType="#//Signal"/>
@@ -4176,11 +5701,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ValueSpecificationAction" eSuperTypes="#//Action">
     <eOperations name="compatible_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//ValueSpecification" containment="true"/>
@@ -4269,7 +5804,12 @@
     </eAnnotations>
     <eOperations name="first_event_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="firstEvent" ordered="false"
         upperBound="2" eType="#//Boolean" defaultValueLiteral="true"/>
@@ -4283,7 +5823,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="DurationObservation" eSuperTypes="#//Observation">
     <eOperations name="first_event_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="event" ordered="false"
         lowerBound="1" upperBound="2" eType="#//NamedElement"/>
@@ -4293,37 +5838,77 @@
   <eClassifiers xsi:type="ecore:EClass" name="FinalState" eSuperTypes="#//State">
     <eOperations name="no_outgoing_transitions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_regions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="cannot_reference_submachine" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_entry_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_exit_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_state_behavior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="TimeEvent" eSuperTypes="#//Event">
     <eOperations name="when_non_negative" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="starting_time" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRelative" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4335,7 +5920,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="VariableAction" abstract="true" eSuperTypes="#//Action">
     <eOperations name="scope_of_variable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="variable" ordered="false"
         lowerBound="1" eType="#//Variable"/>
@@ -4343,11 +5933,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadVariableAction" eSuperTypes="#//VariableAction">
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -4358,11 +5958,21 @@
       eSuperTypes="#//VariableAction">
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -4373,7 +5983,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="AddVariableValueAction" eSuperTypes="#//WriteVariableAction">
     <eOperations name="single_input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4385,7 +6000,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="RemoveVariableValueAction" eSuperTypes="#//WriteVariableAction">
     <eOperations name="unlimited_natural" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRemoveDuplicates" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4403,15 +6023,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ActionInputPin" eSuperTypes="#//InputPin">
     <eOperations name="one_output_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_control_or_data_flow" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" ordered="false"
         lowerBound="1" eType="#//Action" containment="true">
@@ -4421,15 +6056,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="InformationItem" eSuperTypes="#//Classifier">
     <eOperations name="sources_and_targets" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="has_no" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="not_instantiable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="represented" ordered="false"
         upperBound="-1" eType="#//Classifier"/>
@@ -4437,15 +6087,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="InformationFlow" eSuperTypes="#//PackageableElement #//DirectedRelationship">
     <eOperations name="sources_and_targets_kind" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="must_conform" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="convey_classifiers" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="realization" ordered="false"
         upperBound="-1" eType="#//Relationship"/>
@@ -4469,11 +6134,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadExtentAction" eSuperTypes="#//Action">
     <eOperations name="type_is_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -4485,15 +6160,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReclassifyObjectAction" eSuperTypes="#//Action">
     <eOperations name="classifier_not_abstract" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_pin" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isReplaceAll" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4509,19 +6199,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadIsClassifiedObjectAction" eSuperTypes="#//Action">
     <eOperations name="multiplicity_of_input" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_output" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="boolean_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDirect" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4539,11 +6249,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="StartClassifierBehaviorAction" eSuperTypes="#//Action">
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_has_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -4553,31 +6273,66 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadLinkObjectEndAction" eSuperTypes="#//Action">
     <eOperations name="property" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ends_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -4593,35 +6348,75 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReadLinkObjectEndQualifierAction" eSuperTypes="#//Action">
     <eOperations name="qualifier_attribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="association_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="ends_of_association" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_qualifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false"
         lowerBound="1" eType="#//InputPin" containment="true">
@@ -4637,15 +6432,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="CreateLinkObjectAction" eSuperTypes="#//CreateLinkAction">
     <eOperations name="association_class" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -4655,19 +6465,39 @@
   <eClassifiers xsi:type="ecore:EClass" name="AcceptEventAction" eSuperTypes="#//Action">
     <eOperations name="no_input_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="no_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="trigger_events" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshall_signal_events" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isUnmarshall" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4681,15 +6511,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="AcceptCallAction" eSuperTypes="#//AcceptEventAction">
     <eOperations name="result_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="trigger_call_event" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshall" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="returnInformation" ordered="false"
         lowerBound="1" eType="#//OutputPin" containment="true">
@@ -4699,11 +6544,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReplyAction" eSuperTypes="#//Action">
     <eOperations name="pins_match_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="event_on_reply_to_call_trigger" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="replyToCall" ordered="false"
         lowerBound="1" eType="#//Trigger"/>
@@ -4719,31 +6574,66 @@
   <eClassifiers xsi:type="ecore:EClass" name="UnmarshallAction" eSuperTypes="#//Action">
     <eOperations name="same_type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="number_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="type_and_ordering" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="multiplicity_of_result" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="structural_feature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="unmarshallType_is_classifier" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="result" ordered="false"
         lowerBound="1" upperBound="-1" eType="#//OutputPin" containment="true">
@@ -4759,15 +6649,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ReduceAction" eSuperTypes="#//Action">
     <eOperations name="input_type_is_collection" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="output_types_are_compatible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="reducer_inputs_output" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="reducer" ordered="false"
         lowerBound="1" eType="#//Behavior"/>
@@ -4785,11 +6690,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="JoinNode" eSuperTypes="#//ControlNode">
     <eOperations name="one_outgoing_edge" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="incoming_object_flow" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isCombineDuplicate" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="true"/>
@@ -4802,35 +6717,75 @@
   <eClassifiers xsi:type="ecore:EClass" name="ObjectFlow" eSuperTypes="#//ActivityEdge">
     <eOperations name="no_actions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="compatible_types" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="same_upper_bounds" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="transformation_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="selection_behaviour" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="input_and_output_parameter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="is_multicast_or_is_multireceive" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isMulticast" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4844,7 +6799,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="ConditionalNode" eSuperTypes="#//StructuredActivityNode">
     <eOperations name="result_no_incoming" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDeterminate" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4862,11 +6822,21 @@
   <eClassifiers xsi:type="ecore:EClass" name="Clause" eSuperTypes="#//Element">
     <eOperations name="decider_output" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="body_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="test" ordered="false" upperBound="-1"
         eType="#//ExecutableNode"/>
@@ -4884,15 +6854,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="LoopNode" eSuperTypes="#//StructuredActivityNode">
     <eOperations name="input_edges" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="body_output_pins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="result_no_incoming" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="isTestedFirst" ordered="false"
         lowerBound="1" eType="#//Boolean" defaultValueLiteral="false"/>
@@ -4926,7 +6911,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="ExpansionRegion" eSuperTypes="#//StructuredActivityNode">
     <eOperations name="expansion_nodes" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" ordered="false" lowerBound="1"
         eType="#//ExpansionKind" defaultValueLiteral="iterative"/>
@@ -4943,15 +6933,30 @@
   <eClassifiers xsi:type="ecore:EClass" name="ProtocolTransition" eSuperTypes="#//Transition">
     <eOperations name="belongs_to_psm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="associated_actions" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="refers_to_operation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="postCondition" ordered="false"
         eType="#//Constraint">
@@ -4968,7 +6973,12 @@
   <eClassifiers xsi:type="ecore:EClass" name="AssociationClass" eSuperTypes="#//Class #//Association">
     <eOperations name="cannot_be_defined" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="diagnostics" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
-      <eParameters name="context" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"/>
+      <eParameters name="context">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
     </eOperations>
     <eOperations name="allConnections" ordered="false" lowerBound="2" upperBound="-1"
         eType="#//Property"/>
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptCallActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptCallActionOperations.java
index a05d645..c0737b0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptCallActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptCallActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptCallActionOperations.java,v 1.6 2006/01/10 13:10:26 khussey Exp $
+ * $Id: AcceptCallActionOperations.java,v 1.7 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateResultPins(AcceptCallAction acceptCallAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateTriggerCallEvent(
 			AcceptCallAction acceptCallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +125,7 @@
 	 * @generated
 	 */
 	public static boolean validateUnmarshall(AcceptCallAction acceptCallAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptEventActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptEventActionOperations.java
index 59a77c9..ea2aaa8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptEventActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AcceptEventActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AcceptEventActionOperations.java,v 1.5 2006/01/05 22:43:25 khussey Exp $
+ * $Id: AcceptEventActionOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateNoInputPins(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateNoOutputPins(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateTriggerEvents(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -161,7 +161,7 @@
 	 */
 	public static boolean validateUnmarshallSignalEvents(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionExecutionSpecificationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionExecutionSpecificationOperations.java
index c0c1b59..fbe1609 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionExecutionSpecificationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionExecutionSpecificationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionExecutionSpecificationOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ActionExecutionSpecificationOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateActionReferenced(
 			ActionExecutionSpecification actionExecutionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionInputPinOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionInputPinOperations.java
index 1a8bd78..743b416 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionInputPinOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActionInputPinOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActionInputPinOperations.java,v 1.5 2006/05/16 15:07:25 khussey Exp $
+ * $Id: ActionInputPinOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneOutputPin(ActionInputPin actionInputPin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateInputPin(ActionInputPin actionInputPin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +125,7 @@
 	 */
 	public static boolean validateNoControlOrDataFlow(
 			ActionInputPin actionInputPin, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityEdgeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityEdgeOperations.java
index 27ad4f5..c8ef092 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityEdgeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityEdgeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityEdgeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ActivityEdgeOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateSourceAndTarget(ActivityEdge activityEdge,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateOwned(ActivityEdge activityEdge,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,7 @@
 	 * @generated
 	 */
 	public static boolean validateStructuredNode(ActivityEdge activityEdge,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityGroupOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityGroupOperations.java
index 1154252..607c114 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityGroupOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityGroupOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityGroupOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ActivityGroupOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateNodesAndEdges(ActivityGroup activityGroup,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotContained(ActivityGroup activityGroup,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,7 @@
 	 * @generated
 	 */
 	public static boolean validateGroupOwned(ActivityGroup activityGroup,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityNodeOperations.java
index d9fcfb9..0fee7bc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityNodeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ActivityNodeOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateOwned(ActivityNode activityNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,8 @@
 	 * @generated
 	 */
 	public static boolean validateOwnedStructuredNode(
-			ActivityNode activityNode, DiagnosticChain diagnostics, Map context) {
+			ActivityNode activityNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityOperations.java
index f932add..60bc95f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ActivityOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoSupergroups(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateActivityParameterNode(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,7 @@
 	 * @generated
 	 */
 	public static boolean validateAutonomous(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityParameterNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityParameterNodeOperations.java
index 71029f9..23257f3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityParameterNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityParameterNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityParameterNodeOperations.java,v 1.6 2006/04/05 13:50:02 khussey Exp $
+ * $Id: ActivityParameterNodeOperations.java,v 1.7 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 */
 	public static boolean validateHasParameters(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -96,7 +96,7 @@
 	 */
 	public static boolean validateSameType(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -129,7 +129,7 @@
 	 */
 	public static boolean validateNoEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -163,7 +163,7 @@
 	 */
 	public static boolean validateNoIncomingEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -197,7 +197,7 @@
 	 */
 	public static boolean validateNoOutgoingEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityPartitionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityPartitionOperations.java
index 34c6326..4cd837b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityPartitionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActivityPartitionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActivityPartitionOperations.java,v 1.6 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ActivityPartitionOperations.java,v 1.7 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateDimensionNotContained(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateRepresentsPart(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateRepresentsClassifier(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -161,7 +161,7 @@
 	 */
 	public static boolean validateRepresentsPartAndIsContained(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActorOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActorOperations.java
index 958ba09..91ffff7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActorOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ActorOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ActorOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ActorOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -64,7 +64,7 @@
 	 * @generated
 	 */
 	public static boolean validateAssociations(Actor actor,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -96,7 +96,7 @@
 	 * @generated
 	 */
 	public static boolean validateMustHaveName(Actor actor,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddStructuralFeatureValueActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddStructuralFeatureValueActionOperations.java
index b0f4523..9886712 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddStructuralFeatureValueActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddStructuralFeatureValueActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddStructuralFeatureValueActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: AddStructuralFeatureValueActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -67,7 +67,7 @@
 	 */
 	public static boolean validateUnlimitedNaturalAndMultiplicity(
 			AddStructuralFeatureValueAction addStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddVariableValueActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddVariableValueActionOperations.java
index 2cf1258..1464908 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddVariableValueActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AddVariableValueActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AddVariableValueActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: AddVariableValueActionOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -67,7 +67,7 @@
 	 */
 	public static boolean validateSingleInputPin(
 			AddVariableValueAction addVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ArtifactOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ArtifactOperations.java
index b4c6d3c..eebbe1e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ArtifactOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ArtifactOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ArtifactOperations.java,v 1.6 2006/03/07 20:25:17 khussey Exp $
+ * $Id: ArtifactOperations.java,v 1.7 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -52,8 +52,8 @@
 	 * @generated NOT
 	 */
 	public static Operation createOwnedOperation(Artifact artifact,
-			String name, EList parameterNames, EList parameterTypes,
-			Type returnType) {
+			String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType) {
 		return TypeOperations.createOwnedOperation(artifact, name,
 			parameterNames, parameterTypes, returnType);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationClassOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationClassOperations.java
index 256bfad..77dc305 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationClassOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationClassOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AssociationClassOperations.java,v 1.6 2006/01/27 04:55:56 khussey Exp $
+ * $Id: AssociationClassOperations.java,v 1.7 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -24,7 +23,9 @@
 import org.eclipse.emf.common.util.UniqueEList;
 
 import org.eclipse.uml2.uml.AssociationClass;
+import org.eclipse.uml2.uml.Classifier;
 
+import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.util.UMLValidator;
 
 /**
@@ -65,7 +66,7 @@
 	 */
 	public static boolean validateCannotBeDefined(
 			AssociationClass associationClass, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -96,14 +97,12 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allConnections(AssociationClass associationClass) {
-		EList allConnections = new UniqueEList.FastCompare(associationClass
-			.getMemberEnds());
+	public static EList<Property> allConnections(
+			AssociationClass associationClass) {
+		EList<Property> allConnections = new UniqueEList.FastCompare<Property>(
+			associationClass.getMemberEnds());
 
-		for (Iterator allParents = associationClass.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Object parent = allParents.next();
+		for (Classifier parent : associationClass.allParents()) {
 
 			if (parent instanceof AssociationClass) {
 				allConnections.addAll(((AssociationClass) parent)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationOperations.java
index 58cdb21..95b416b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/AssociationOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: AssociationOperations.java,v 1.10 2006/03/08 19:03:02 khussey Exp $
+ * $Id: AssociationOperations.java,v 1.11 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -72,7 +71,7 @@
 	 * @generated
 	 */
 	public static boolean validateSpecializedEndNumber(Association association,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -104,7 +103,7 @@
 	 * @generated
 	 */
 	public static boolean validateSpecializedEndTypes(Association association,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -136,7 +135,7 @@
 	 * @generated
 	 */
 	public static boolean validateBinaryAssociations(Association association,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -168,7 +167,7 @@
 	 * @generated
 	 */
 	public static boolean validateAssociationEnds(Association association,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -208,13 +207,11 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getEndTypes(Association association) {
-		EList endTypes = new UniqueEList.FastCompare();
+	public static EList<Type> getEndTypes(Association association) {
+		EList<Type> endTypes = new UniqueEList.FastCompare<Type>();
 
-		for (Iterator memberEnds = association.getMemberEnds().iterator(); memberEnds
-			.hasNext();) {
-
-			Type endType = (Type) ((Property) memberEnds.next()).eGet(
+		for (Property memberEnd : association.getMemberEnds()) {
+			Type endType = (Type) memberEnd.eGet(
 				UMLPackage.Literals.TYPED_ELEMENT__TYPE, false);
 
 			if (endType != null) {
@@ -222,7 +219,7 @@
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) association,
+		return new UnionEObjectEList<Type>((InternalEObject) association,
 			UMLPackage.Literals.ASSOCIATION__END_TYPE, endTypes.size(),
 			endTypes.toArray());
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehaviorOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehaviorOperations.java
index 6cfcba7..b310119 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehaviorOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehaviorOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehaviorOperations.java,v 1.11 2006/05/05 19:36:07 khussey Exp $
+ * $Id: BehaviorOperations.java,v 1.12 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -70,13 +70,14 @@
 	 * @generated NOT
 	 */
 	public static boolean validateParametersMatch(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 		BehavioralFeature specification = behavior.getSpecification();
 
 		if (specification != null) {
-			EList behaviorOwnedParameters = behavior.getOwnedParameters();
-			EList specificationOwnedParameters = specification
+			EList<Parameter> behaviorOwnedParameters = behavior
+				.getOwnedParameters();
+			EList<Parameter> specificationOwnedParameters = specification
 				.getOwnedParameters();
 
 			if (behaviorOwnedParameters.size() != specificationOwnedParameters
@@ -84,14 +85,13 @@
 
 				result = false;
 			} else {
-				Iterator bop = behaviorOwnedParameters.iterator();
-				Iterator sop = specificationOwnedParameters.iterator();
+				Iterator<Parameter> bop = behaviorOwnedParameters.iterator();
+				Iterator<Parameter> sop = specificationOwnedParameters
+					.iterator();
 
 				while (bop.hasNext() && sop.hasNext()) {
 
-					if (!ParameterOperations.matches((Parameter) bop.next(),
-						(Parameter) sop.next())) {
-
+					if (!ParameterOperations.matches(bop.next(), sop.next())) {
 						result = false;
 						break;
 					}
@@ -121,7 +121,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateFeatureOfContextClassifier(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		BehavioralFeature specification = behavior.getSpecification();
 
 		if (specification != null) {
@@ -160,7 +160,7 @@
 	 * @generated
 	 */
 	public static boolean validateMustRealize(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -192,7 +192,7 @@
 	 * @generated
 	 */
 	public static boolean validateMostOneBehaviour(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioralFeatureOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioralFeatureOperations.java
index b00fad0..bc8d42e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioralFeatureOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioralFeatureOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioralFeatureOperations.java,v 1.6 2006/02/22 20:48:22 khussey Exp $
+ * $Id: BehavioralFeatureOperations.java,v 1.7 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -82,22 +82,20 @@
 			BehavioralFeature behavioralFeature, NamedElement n, Namespace ns) {
 
 		if (n instanceof BehavioralFeature) {
-			EList namesOfMemberN = ns.getNamesOfMember(n);
+			EList<String> namesOfMemberN = ns.getNamesOfMember(n);
 
-			for (Iterator namesOfMemberBF = ns.getNamesOfMember(
-				behavioralFeature).iterator(); namesOfMemberBF.hasNext();) {
+			for (String nameOfMemberBF : ns.getNamesOfMember(behavioralFeature)) {
 
-				if (namesOfMemberN.contains(namesOfMemberBF.next())) {
-					Iterator bfParameters = behavioralFeature
+				if (namesOfMemberN.contains(nameOfMemberBF)) {
+					Iterator<Parameter> bfParameters = behavioralFeature
 						.getOwnedParameters().iterator();
-					Iterator nParameters = ((BehavioralFeature) n)
+					Iterator<Parameter> nParameters = ((BehavioralFeature) n)
 						.getOwnedParameters().iterator();
 
 					while (bfParameters.hasNext() && nParameters.hasNext()) {
 
-						if (!safeEquals(((Parameter) bfParameters.next())
-							.getType(), ((Parameter) nParameters.next())
-							.getType())) {
+						if (!safeEquals(bfParameters.next().getType(),
+							nParameters.next().getType())) {
 
 							return true;
 						}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioredClassifierOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioredClassifierOperations.java
index b77613a..d75e16e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioredClassifierOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BehavioredClassifierOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BehavioredClassifierOperations.java,v 1.9 2006/03/08 19:03:02 khussey Exp $
+ * $Id: BehavioredClassifierOperations.java,v 1.10 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -68,7 +67,7 @@
 	 */
 	public static boolean validateClassBehavior(
 			BehavioredClassifier behavioredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,10 +94,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getImplementedInterfaces(
+	public static EList<Interface> getImplementedInterfaces(
 			BehavioredClassifier behavioredClassifier) {
 		return getRealizedInterfaces(behavioredClassifier,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<Interface>());
 	}
 
 	/**
@@ -106,21 +105,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllImplementedInterfaces(
+	public static EList<Interface> getAllImplementedInterfaces(
 			BehavioredClassifier behavioredClassifier) {
 		return getAllRealizedInterfaces(behavioredClassifier,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<Interface>());
 	}
 
-	protected static EList getRealizedInterfaces(
-			BehavioredClassifier behavioredClassifier, EList realizedInterfaces) {
+	protected static EList<Interface> getRealizedInterfaces(
+			BehavioredClassifier behavioredClassifier,
+			EList<Interface> realizedInterfaces) {
 
-		for (Iterator interfaceRealizations = behavioredClassifier
-			.getInterfaceRealizations().iterator(); interfaceRealizations
-			.hasNext();) {
+		for (InterfaceRealization interfaceRealization : behavioredClassifier
+			.getInterfaceRealizations()) {
 
-			Interface contract = ((InterfaceRealization) interfaceRealizations
-				.next()).getContract();
+			Interface contract = interfaceRealization.getContract();
 
 			if (contract != null) {
 				realizedInterfaces.add(contract);
@@ -130,15 +128,12 @@
 		return realizedInterfaces;
 	}
 
-	protected static EList getAllRealizedInterfaces(
+	protected static EList<Interface> getAllRealizedInterfaces(
 			BehavioredClassifier behavioredClassifier,
-			EList allRealizedInterfaces) {
+			EList<Interface> allRealizedInterfaces) {
 		getRealizedInterfaces(behavioredClassifier, allRealizedInterfaces);
 
-		for (Iterator allParents = behavioredClassifier.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Classifier parent = (Classifier) allParents.next();
+		for (Classifier parent : behavioredClassifier.allParents()) {
 
 			if (parent instanceof BehavioredClassifier) {
 				getRealizedInterfaces((BehavioredClassifier) parent,
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BroadcastSignalActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BroadcastSignalActionOperations.java
index 4efc8b6..f82f8a2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BroadcastSignalActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/BroadcastSignalActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: BroadcastSignalActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: BroadcastSignalActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateNumberAndOrder(
 			BroadcastSignalAction broadcastSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateTypeOrderingMultiplicity(
 			BroadcastSignalAction broadcastSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallActionOperations.java
index 63aa73d..4d05c02 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallActionOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: CallActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateSynchronousCall(CallAction callAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateNumberAndOrder(CallAction callAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,8 @@
 	 * @generated
 	 */
 	public static boolean validateTypeOrderingMultiplicity(
-			CallAction callAction, DiagnosticChain diagnostics, Map context) {
+			CallAction callAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallBehaviorActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallBehaviorActionOperations.java
index 831248c..64d5e81 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallBehaviorActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallBehaviorActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallBehaviorActionOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: CallBehaviorActionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateArgumentPinEqualParameter(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateResultPinEqualParameter(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateTypeOrderingMultiplicity(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallOperationActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallOperationActionOperations.java
index 89c7cc8..f7d6070 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallOperationActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CallOperationActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CallOperationActionOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: CallOperationActionOperations.java,v 1.6 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateArgumentPinEqualParameter(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateResultPinEqualParameter(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateTypeTargetPin(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -162,7 +162,7 @@
 	 */
 	public static boolean validateTypeOrderingMultiplicity(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassOperations.java
index d6d4bcb..64c7a20 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassOperations.java,v 1.19 2006/05/09 17:53:38 khussey Exp $
+ * $Id: ClassOperations.java,v 1.20 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -80,7 +79,7 @@
 	 */
 	public static boolean validatePassiveClass(
 			org.eclipse.uml2.uml.Class class_, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 
 		if (!class_.isActive() && !(class_.getOwnedReceptions().isEmpty())) {
 
@@ -104,34 +103,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getExtensions(org.eclipse.uml2.uml.Class class_) {
-		EList extensions = ECollections.EMPTY_ELIST;
+	public static EList<Extension> getExtensions(
+			org.eclipse.uml2.uml.Class class_) {
+		EList<Extension> extensions = ECollections.<Extension> emptyEList();
 
 		if (class_.isMetaclass()) {
-			extensions = new UniqueEList.FastCompare();
+			extensions = new UniqueEList.FastCompare<Extension>();
 
-			for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-				class_).iterator(); nonNavigableInverseReferences.hasNext();) {
+			for (EStructuralFeature.Setting nonNavigableInverseReference : getNonNavigableInverseReferences(class_)) {
 
-				EStructuralFeature.Setting setting = (EStructuralFeature.Setting) nonNavigableInverseReferences
-					.next();
-
-				if (setting.getEStructuralFeature() == UMLPackage.Literals.TYPED_ELEMENT__TYPE) {
-					EObject eObject = setting.getEObject();
+				if (nonNavigableInverseReference.getEStructuralFeature() == UMLPackage.Literals.TYPED_ELEMENT__TYPE) {
+					EObject eObject = nonNavigableInverseReference.getEObject();
 
 					if (eObject instanceof Property) {
 						Association association = ((Property) eObject)
 							.getAssociation();
 
 						if (association instanceof Extension) {
-							extensions.add(association);
+							extensions.add((Extension) association);
 						}
 					}
 				}
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) class_,
+		return new UnionEObjectEList<Extension>((InternalEObject) class_,
 			UMLPackage.Literals.CLASS__EXTENSION, extensions.size(), extensions
 				.toArray());
 	}
@@ -143,7 +139,8 @@
 	 */
 	public static Operation createOwnedOperation(
 			org.eclipse.uml2.uml.Class class_, String name,
-			EList parameterNames, EList parameterTypes, Type returnType) {
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			Type returnType) {
 		return TypeOperations.createOwnedOperation(class_, name,
 			parameterNames, parameterTypes, returnType);
 	}
@@ -167,15 +164,12 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList inherit(org.eclipse.uml2.uml.Class class_, EList inhs) {
-		EList inherit = new UniqueEList.FastCompare();
+	public static EList<NamedElement> inherit(
+			org.eclipse.uml2.uml.Class class_, EList<NamedElement> inhs) {
+		EList<NamedElement> inherit = new UniqueEList.FastCompare<NamedElement>();
+		EList<RedefinableElement> redefinedElements = new UniqueEList.FastCompare<RedefinableElement>();
 
-		EList redefinedElements = new UniqueEList.FastCompare();
-
-		for (Iterator ownedMembers = class_.getOwnedMembers().iterator(); ownedMembers
-			.hasNext();) {
-
-			Object ownedMember = ownedMembers.next();
+		for (NamedElement ownedMember : class_.getOwnedMembers()) {
 
 			if (ownedMember instanceof RedefinableElement) {
 				redefinedElements.addAll(((RedefinableElement) ownedMember)
@@ -183,8 +177,7 @@
 			}
 		}
 
-		for (Iterator i = inhs.iterator(); i.hasNext();) {
-			Object inh = i.next();
+		for (NamedElement inh : inhs) {
 
 			if (!redefinedElements.contains(inh)) {
 				inherit.add(inh);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierOperations.java
index d2a3516..6cf056a7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassifierOperations.java,v 1.18 2006/04/13 03:21:44 khussey Exp $
+ * $Id: ClassifierOperations.java,v 1.19 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -39,6 +38,7 @@
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLFactory;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.UMLPlugin;
@@ -104,7 +104,8 @@
 	 * @generated NOT
 	 */
 	public static boolean validateNoCyclesInGeneralization(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		boolean result = true;
 
 		if (classifier.allParents().contains(classifier)) {
@@ -134,13 +135,10 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSpecializeType(Classifier classifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
-		for (Iterator parents = classifier.parents().iterator(); parents
-			.hasNext();) {
-
-			Classifier parent = (Classifier) parents.next();
+		for (Classifier parent : classifier.parents()) {
 
 			if (!classifier.maySpecializeType(parent)) {
 				result = false;
@@ -173,7 +171,8 @@
 	 * @generated
 	 */
 	public static boolean validateGeneralizationHierarchies(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -205,7 +204,8 @@
 	 * @generated
 	 */
 	public static boolean validateMapsToGeneralizationSet(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -232,16 +232,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllAttributes(Classifier classifier) {
-		EList allAttributes = new UniqueEList.FastCompare();
+	public static EList<Property> getAllAttributes(Classifier classifier) {
+		EList<Property> allAttributes = new UniqueEList.FastCompare<Property>();
 
-		for (Iterator allFeatures = classifier.allFeatures().iterator(); allFeatures
-			.hasNext();) {
-
-			Object feature = allFeatures.next();
+		for (Feature feature : classifier.allFeatures()) {
 
 			if (feature instanceof Property) {
-				allAttributes.add(feature);
+				allAttributes.add((Property) feature);
 			}
 		}
 
@@ -253,16 +250,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getOperations(Classifier classifier) {
-		EList operations = new UniqueEList.FastCompare();
+	public static EList<Operation> getOperations(Classifier classifier) {
+		EList<Operation> operations = new UniqueEList.FastCompare<Operation>();
 
-		for (Iterator features = classifier.getFeatures().iterator(); features
-			.hasNext();) {
-
-			Object feature = features.next();
+		for (Feature feature : classifier.getFeatures()) {
 
 			if (feature instanceof Operation) {
-				operations.add(feature);
+				operations.add((Operation) feature);
 			}
 		}
 
@@ -274,16 +268,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllOperations(Classifier classifier) {
-		EList allOperations = new UniqueEList.FastCompare();
+	public static EList<Operation> getAllOperations(Classifier classifier) {
+		EList<Operation> allOperations = new UniqueEList.FastCompare<Operation>();
 
-		for (Iterator allFeatures = classifier.allFeatures().iterator(); allFeatures
-			.hasNext();) {
-
-			Object feature = allFeatures.next();
+		for (Feature feature : classifier.allFeatures()) {
 
 			if (feature instanceof Operation) {
-				allOperations.add(feature);
+				allOperations.add((Operation) feature);
 			}
 		}
 
@@ -296,7 +287,7 @@
 	 * @generated NOT
 	 */
 	public static Operation getOperation(Classifier classifier, String name,
-			EList parameterNames, EList parameterTypes) {
+			EList<String> parameterNames, EList<Type> parameterTypes) {
 		return classifier.getOperation(name, parameterNames, parameterTypes,
 			false);
 	}
@@ -307,19 +298,18 @@
 	 * @generated NOT
 	 */
 	public static Operation getOperation(Classifier classifier, String name,
-			EList parameterNames, EList parameterTypes, boolean ignoreCase) {
-		operationLoop : for (Iterator i = classifier.getOperations().iterator(); i
-			.hasNext();) {
-
-			Operation ownedOperation = (Operation) i.next();
+			EList<String> parameterNames, EList<Type> parameterTypes,
+			boolean ignoreCase) {
+		operationLoop : for (Operation operation : classifier.getOperations()) {
 
 			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedOperation.getName())
-				: name.equals(ownedOperation.getName())))
+				? name.equalsIgnoreCase(operation.getName())
+				: name.equals(operation.getName())))
 
 				continue operationLoop;
 
-			EList ownedParameterList = ownedOperation.getOwnedParameters();
+			EList<Parameter> ownedParameterList = operation
+				.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
 
 			if (parameterNames != null
@@ -329,13 +319,12 @@
 				continue operationLoop;
 
 			for (int j = 0; j < ownedParameterListSize; j++) {
-				Parameter ownedParameter = (Parameter) ownedParameterList
-					.get(j);
+				Parameter ownedParameter = ownedParameterList.get(j);
 
 				if (parameterNames != null
 					&& !(ignoreCase
-						? ((String) parameterNames.get(j))
-							.equalsIgnoreCase(ownedParameter.getName())
+						? parameterNames.get(j).equalsIgnoreCase(
+							ownedParameter.getName())
 						: parameterNames.get(j)
 							.equals(ownedParameter.getName())))
 
@@ -347,7 +336,7 @@
 					continue operationLoop;
 			}
 
-			return ownedOperation;
+			return operation;
 		}
 
 		return null;
@@ -358,8 +347,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getUsedInterfaces(Classifier classifier) {
-		return getUsedInterfaces(classifier, new UniqueEList.FastCompare());
+	public static EList<Interface> getUsedInterfaces(Classifier classifier) {
+		return getUsedInterfaces(classifier,
+			new UniqueEList.FastCompare<Interface>());
 	}
 
 	/**
@@ -367,8 +357,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllUsedInterfaces(Classifier classifier) {
-		return getAllUsedInterfaces(classifier, new UniqueEList.FastCompare());
+	public static EList<Interface> getAllUsedInterfaces(Classifier classifier) {
+		return getAllUsedInterfaces(classifier,
+			new UniqueEList.FastCompare<Interface>());
 	}
 
 	/**
@@ -385,31 +376,36 @@
 	}
 
 	protected static class GeneralEList
-			extends DerivedSubsetEObjectEList {
+			extends DerivedSubsetEObjectEList<Object> {
 
-		protected GeneralEList(Class dataClass, InternalEObject owner,
+		protected GeneralEList(Class<?> dataClass, InternalEObject owner,
 				int featureID, int[] sourceFeatureIDs) {
 			super(dataClass, owner, featureID, sourceFeatureIDs);
 		}
 
-		public List basicList() {
+		@Override
+		public List<Object> basicList() {
 			return new GeneralEList(dataClass, owner, featureID,
 				sourceFeatureIDs) {
 
-				public ListIterator listIterator(int index) {
+				@Override
+				public ListIterator<Object> listIterator(int index) {
 					return basicListIterator(index);
 				}
 			};
 		}
 
+		@Override
 		protected boolean isIncluded(EStructuralFeature feature) {
 			return false;
 		}
 
+		@Override
 		protected Object derive(Object object) {
 			return ((Generalization) object).getGeneral();
 		}
 
+		@Override
 		protected Object validate(int index, Object object) {
 			Generalization generalization = UMLFactory.eINSTANCE
 				.createGeneralization();
@@ -431,9 +427,11 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getGenerals(Classifier classifier) {
-		return new GeneralEList(Classifier.class, (InternalEObject) classifier,
-			UMLPackage.CLASSIFIER__GENERAL, GENERAL_ESUPERSETS);
+	@SuppressWarnings("unchecked")
+	public static EList<Classifier> getGenerals(Classifier classifier) {
+		return (EList<Classifier>) ((EList<?>) new GeneralEList(
+			Classifier.class, (InternalEObject) classifier,
+			UMLPackage.CLASSIFIER__GENERAL, GENERAL_ESUPERSETS));
 	}
 
 	/**
@@ -445,19 +443,17 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getInheritedMembers(Classifier classifier) {
-		EList inheritedMembers = new UniqueEList.FastCompare();
+	public static EList<NamedElement> getInheritedMembers(Classifier classifier) {
+		EList<NamedElement> inheritedMembers = new UniqueEList.FastCompare<NamedElement>();
 
-		for (Iterator parents = classifier.parents().iterator(); parents
-			.hasNext();) {
-
-			inheritedMembers.addAll(((Classifier) parents.next())
-				.inheritableMembers(classifier));
+		for (Classifier parent : classifier.parents()) {
+			inheritedMembers.addAll(parent.inheritableMembers(classifier));
 		}
 
-		EList inherit = classifier.inherit(inheritedMembers);
+		EList<NamedElement> inherit = classifier.inherit(inheritedMembers);
 
-		return new UnionEObjectEList((InternalEObject) classifier,
+		return new UnionEObjectEList<NamedElement>(
+			(InternalEObject) classifier,
 			UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER, inherit.size(),
 			inherit.toArray());
 	}
@@ -471,16 +467,13 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allFeatures(Classifier classifier) {
-		EList allFeatures = new UniqueEList.FastCompare();
+	public static EList<Feature> allFeatures(Classifier classifier) {
+		EList<Feature> allFeatures = new UniqueEList.FastCompare<Feature>();
 
-		for (Iterator members = classifier.getMembers().iterator(); members
-			.hasNext();) {
-
-			Object member = members.next();
+		for (NamedElement member : classifier.getMembers()) {
 
 			if (member instanceof Feature) {
-				allFeatures.add(member);
+				allFeatures.add((Feature) member);
 			}
 		}
 
@@ -496,14 +489,11 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList parents(Classifier classifier) {
-		EList parents = new UniqueEList.FastCompare();
+	public static EList<Classifier> parents(Classifier classifier) {
+		EList<Classifier> parents = new UniqueEList.FastCompare<Classifier>();
 
-		for (Iterator generalizations = classifier.getGeneralizations()
-			.iterator(); generalizations.hasNext();) {
-
-			Classifier general = ((Generalization) generalizations.next())
-				.getGeneral();
+		for (Generalization generalization : classifier.getGeneralizations()) {
+			Classifier general = generalization.getGeneral();
 
 			if (general != null) {
 				parents.add(general);
@@ -523,8 +513,9 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList inheritableMembers(Classifier classifier, Classifier c) {
-		EList inheritableMembers = new UniqueEList.FastCompare();
+	public static EList<NamedElement> inheritableMembers(Classifier classifier,
+			Classifier c) {
+		EList<NamedElement> inheritableMembers = new UniqueEList.FastCompare<NamedElement>();
 
 		if (c == classifier || !c.allParents().contains(classifier)
 			|| classifier.allParents().contains(c)) {
@@ -532,10 +523,7 @@
 			return inheritableMembers;
 		}
 
-		for (Iterator members = classifier.getMembers().iterator(); members
-			.hasNext();) {
-
-			NamedElement member = (NamedElement) members.next();
+		for (NamedElement member : classifier.getMembers()) {
 
 			if (c.hasVisibilityOf(member)) {
 				inheritableMembers.add(member);
@@ -557,10 +545,7 @@
 	 */
 	public static boolean hasVisibilityOf(Classifier classifier, NamedElement n) {
 
-		for (Iterator allParents = classifier.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Classifier parent = (Classifier) allParents.next();
+		for (Classifier parent : classifier.allParents()) {
 
 			if (parent != classifier && parent.getMembers().contains(n)) {
 				return n.getVisibility() != VisibilityKind.PRIVATE_LITERAL;
@@ -593,16 +578,15 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList inherit(Classifier classifier, EList inhs) {
+	public static EList<NamedElement> inherit(Classifier classifier,
+			EList<NamedElement> inhs) {
 		return ECollections.unmodifiableEList(inhs);
 	}
 
-	protected static EList allParents(Classifier classifier, EList allParents) {
+	protected static EList<Classifier> allParents(Classifier classifier,
+			EList<Classifier> allParents) {
 
-		for (Iterator parents = classifier.parents().iterator(); parents
-			.hasNext();) {
-
-			Classifier parent = (Classifier) parents.next();
+		for (Classifier parent : classifier.parents()) {
 
 			if (allParents.add(parent)) {
 				allParents(parent, allParents);
@@ -621,9 +605,9 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allParents(Classifier classifier) {
+	public static EList<Classifier> allParents(Classifier classifier) {
 		return ECollections.unmodifiableEList(allParents(classifier,
-			new UniqueEList.FastCompare()));
+			new UniqueEList.FastCompare<Classifier>()));
 	}
 
 	/**
@@ -639,12 +623,9 @@
 
 		if (classifier.getOwnedTemplateSignature() == null) {
 
-			for (Iterator allParents = classifier.allParents().iterator(); allParents
-				.hasNext();) {
+			for (Classifier parent : classifier.allParents()) {
 
-				if (((Classifier) allParents.next())
-					.getOwnedTemplateSignature() != null) {
-
+				if (parent.getOwnedTemplateSignature() != null) {
 					return true;
 				}
 			}
@@ -655,23 +636,17 @@
 		return true;
 	}
 
-	protected static EList getUsedInterfaces(Classifier classifier,
-			EList usedInterfaces) {
+	protected static EList<Interface> getUsedInterfaces(Classifier classifier,
+			EList<Interface> usedInterfaces) {
 
-		for (Iterator clientDependencies = classifier.getClientDependencies()
-			.iterator(); clientDependencies.hasNext();) {
+		for (Dependency clientDependency : classifier.getClientDependencies()) {
 
-			Dependency dependency = (Dependency) clientDependencies.next();
+			if (clientDependency instanceof Usage) {
 
-			if (dependency instanceof Usage) {
-
-				for (Iterator suppliers = dependency.getSuppliers().iterator(); suppliers
-					.hasNext();) {
-
-					Object supplier = suppliers.next();
+				for (NamedElement supplier : clientDependency.getSuppliers()) {
 
 					if (supplier instanceof Interface) {
-						usedInterfaces.add(supplier);
+						usedInterfaces.add((Interface) supplier);
 					}
 				}
 			}
@@ -680,14 +655,12 @@
 		return usedInterfaces;
 	}
 
-	protected static EList getAllUsedInterfaces(Classifier classifier,
-			EList allUsedInterfaces) {
+	protected static EList<Interface> getAllUsedInterfaces(
+			Classifier classifier, EList<Interface> allUsedInterfaces) {
 		getUsedInterfaces(classifier, allUsedInterfaces);
 
-		for (Iterator allParents = classifier.allParents().iterator(); allParents
-			.hasNext();) {
-
-			getUsedInterfaces((Classifier) allParents.next(), allUsedInterfaces);
+		for (Classifier parent : classifier.allParents()) {
+			getUsedInterfaces(parent, allUsedInterfaces);
 		}
 
 		return allUsedInterfaces;
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierTemplateParameterOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierTemplateParameterOperations.java
index b6bbfc0..449eb51 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierTemplateParameterOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClassifierTemplateParameterOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClassifierTemplateParameterOperations.java,v 1.5 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ClassifierTemplateParameterOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateHasConstrainingClassifier(
 			ClassifierTemplateParameter classifierTemplateParameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClauseOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClauseOperations.java
index eb5f016..6a2ae41 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClauseOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClauseOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClauseOperations.java,v 1.5 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ClauseOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateDeciderOutput(Clause clause,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateBodyOutputPins(Clause clause,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClearAssociationActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClearAssociationActionOperations.java
index 398ec66..aca534c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClearAssociationActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ClearAssociationActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ClearAssociationActionOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ClearAssociationActionOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateSameType(
 			ClearAssociationAction clearAssociationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			ClearAssociationAction clearAssociationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CollaborationUseOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CollaborationUseOperations.java
index dc34f2c..4a561a3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CollaborationUseOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CollaborationUseOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CollaborationUseOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: CollaborationUseOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateClientElements(
 			CollaborationUse collaborationUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 * @generated
 	 */
 	public static boolean validateEveryRole(CollaborationUse collaborationUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +125,7 @@
 	 * @generated
 	 */
 	public static boolean validateConnectors(CollaborationUse collaborationUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CombinedFragmentOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CombinedFragmentOperations.java
index 4fff849..fece1a3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CombinedFragmentOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CombinedFragmentOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CombinedFragmentOperations.java,v 1.5 2006/04/05 20:23:13 khussey Exp $
+ * $Id: CombinedFragmentOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -67,7 +66,7 @@
 	 */
 	public static boolean validateOptLoopBreakNeg(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 
 		switch (combinedFragment.getInteractionOperator().getValue()) {
 			case InteractionOperatorKind.OPT :
@@ -109,15 +108,12 @@
 	 */
 	public static boolean validateMinintAndMaxint(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 
 		if (combinedFragment.getInteractionOperator() != InteractionOperatorKind.LOOP_LITERAL) {
 
-			for (Iterator operands = combinedFragment.getOperands().iterator(); operands
-				.hasNext();) {
-
-				InteractionConstraint guard = ((InteractionOperand) operands
-					.next()).getGuard();
+			for (InteractionOperand operand : combinedFragment.getOperands()) {
+				InteractionConstraint guard = operand.getGuard();
 
 				if (guard != null
 					&& (guard.getMinint() != null || guard.getMaxint() != null)) {
@@ -154,7 +150,7 @@
 	 * @generated
 	 */
 	public static boolean validateBreak(CombinedFragment combinedFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -187,7 +183,7 @@
 	 */
 	public static boolean validateConsiderAndIgnore(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CommunicationPathOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CommunicationPathOperations.java
index 157cba7..b5b26eb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CommunicationPathOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CommunicationPathOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CommunicationPathOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: CommunicationPathOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateAssociationEnds(
 			CommunicationPath communicationPath, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ComponentOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ComponentOperations.java
index b3421c7..da3d230 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ComponentOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ComponentOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ComponentOperations.java,v 1.12 2006/10/11 16:30:15 khussey Exp $
+ * $Id: ComponentOperations.java,v 1.13 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -26,6 +26,7 @@
 import org.eclipse.uml2.uml.ComponentRealization;
 import org.eclipse.uml2.uml.Dependency;
 import org.eclipse.uml2.uml.Interface;
+import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.PrimitiveType;
 import org.eclipse.uml2.uml.Realization;
 import org.eclipse.uml2.uml.Port;
@@ -122,37 +123,35 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList realizedInterfaces(Component component,
+	public static EList<Interface> realizedInterfaces(Component component,
 			Classifier classifier) {
 		return ECollections.unmodifiableEList(realizedInterfaces(component,
 			classifier, true));
 	}
 
-	protected static EList realizedInterfaces(Component component,
+	protected static EList<Interface> realizedInterfaces(Component component,
 			Classifier classifier, boolean resolve) {
 		return realizedInterfaces(component, classifier, resolve,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<Interface>());
 	}
 
-	protected static EList realizedInterfaces(Component component,
-			Classifier classifier, boolean resolve, EList realizedInterfaces) {
+	protected static EList<Interface> realizedInterfaces(Component component,
+			Classifier classifier, boolean resolve,
+			EList<Interface> realizedInterfaces) {
 
-		for (Iterator clientDependencies = classifier.getClientDependencies()
-			.iterator(); clientDependencies.hasNext();) {
+		for (Dependency clientDependency : classifier.getClientDependencies()) {
 
-			Dependency dependency = (Dependency) clientDependencies.next();
-
-			if (dependency instanceof Realization) {
-				Iterator suppliers = resolve
-					? dependency.getSuppliers().iterator()
-					: ((InternalEList) dependency.getSuppliers())
-						.basicIterator();
+			if (clientDependency instanceof Realization) {
+				Iterator<NamedElement> suppliers = resolve
+					? clientDependency.getSuppliers().iterator()
+					: ((InternalEList<NamedElement>) clientDependency
+						.getSuppliers()).basicIterator();
 
 				while (suppliers.hasNext()) {
-					Object supplier = suppliers.next();
+					NamedElement supplier = suppliers.next();
 
 					if (supplier instanceof Interface) {
-						realizedInterfaces.add(supplier);
+						realizedInterfaces.add((Interface) supplier);
 					}
 				}
 			}
@@ -172,37 +171,35 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList usedInterfaces(Component component,
+	public static EList<Interface> usedInterfaces(Component component,
 			Classifier classifier) {
 		return ECollections.unmodifiableEList(usedInterfaces(component,
 			classifier, true));
 	}
 
-	protected static EList usedInterfaces(Component component,
+	protected static EList<Interface> usedInterfaces(Component component,
 			Classifier classifier, boolean resolve) {
 		return usedInterfaces(component, classifier, resolve,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<Interface>());
 	}
 
-	protected static EList usedInterfaces(Component component,
-			Classifier classifier, boolean resolve, EList usedInterfaces) {
+	protected static EList<Interface> usedInterfaces(Component component,
+			Classifier classifier, boolean resolve,
+			EList<Interface> usedInterfaces) {
 
-		for (Iterator clientDependencies = classifier.getClientDependencies()
-			.iterator(); clientDependencies.hasNext();) {
+		for (Dependency clientDependency : classifier.getClientDependencies()) {
 
-			Dependency dependency = (Dependency) clientDependencies.next();
-
-			if (dependency instanceof Usage) {
-				Iterator suppliers = resolve
-					? dependency.getSuppliers().iterator()
-					: ((InternalEList) dependency.getSuppliers())
-						.basicIterator();
+			if (clientDependency instanceof Usage) {
+				Iterator<NamedElement> suppliers = resolve
+					? clientDependency.getSuppliers().iterator()
+					: ((InternalEList<NamedElement>) clientDependency
+						.getSuppliers()).basicIterator();
 
 				while (suppliers.hasNext()) {
-					Object supplier = suppliers.next();
+					NamedElement supplier = suppliers.next();
 
 					if (supplier instanceof Interface) {
-						usedInterfaces.add(supplier);
+						usedInterfaces.add((Interface) supplier);
 					}
 				}
 			}
@@ -227,36 +224,29 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getRequireds(Component component) {
-		EList requireds = usedInterfaces(component, component, false,
-			new UniqueEList.FastCompare());
+	public static EList<Interface> getRequireds(Component component) {
+		EList<Interface> requireds = usedInterfaces(component, component,
+			false, new UniqueEList.FastCompare<Interface>());
 
-		for (Iterator realizations = component.getRealizations().iterator(); realizations
-			.hasNext();) {
-
-			Classifier realizingClassifier = ((ComponentRealization) realizations
-				.next()).getRealizingClassifier();
+		for (ComponentRealization realization : component.getRealizations()) {
+			Classifier realizingClassifier = realization
+				.getRealizingClassifier();
 
 			if (realizingClassifier != null) {
 				usedInterfaces(component, realizingClassifier, false, requireds);
 
-				for (Iterator allParents = realizingClassifier.allParents()
-					.iterator(); allParents.hasNext();) {
-
-					usedInterfaces(component, (Classifier) allParents.next(),
-						false, requireds);
+				for (Classifier parent : realizingClassifier.allParents()) {
+					usedInterfaces(component, parent, false, requireds);
 				}
 			}
 		}
 
-		for (Iterator ownedPorts = component.getOwnedPorts().iterator(); ownedPorts
-			.hasNext();) {
-
-			requireds.addAll(((InternalEList) ((Port) ownedPorts.next())
+		for (Port ownedPort : component.getOwnedPorts()) {
+			requireds.addAll(((InternalEList<Interface>) ownedPort
 				.getRequireds()).basicList());
 		}
 
-		return new UnionEObjectEList((InternalEObject) component,
+		return new UnionEObjectEList<Interface>((InternalEObject) component,
 			UMLPackage.Literals.COMPONENT__REQUIRED, requireds.size(),
 			requireds.toArray());
 	}
@@ -279,75 +269,60 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getProvideds(Component component) {
-		EList provideds = realizedInterfaces(component, component, false,
-			new UniqueEList.FastCompare());
+	public static EList<Interface> getProvideds(Component component) {
+		EList<Interface> provideds = realizedInterfaces(component, component,
+			false, new UniqueEList.FastCompare<Interface>());
 
-		for (Iterator realizations = component.getRealizations().iterator(); realizations
-			.hasNext();) {
-
-			Classifier realizingClassifier = ((ComponentRealization) realizations
-				.next()).getRealizingClassifier();
+		for (ComponentRealization realization : component.getRealizations()) {
+			Classifier realizingClassifier = realization
+				.getRealizingClassifier();
 
 			if (realizingClassifier != null) {
 				realizedInterfaces(component, realizingClassifier, false,
 					provideds);
 
-				for (Iterator allParents = realizingClassifier.allParents()
-					.iterator(); allParents.hasNext();) {
-
-					realizedInterfaces(component, (Classifier) allParents
-						.next(), false, provideds);
+				for (Classifier parent : realizingClassifier.allParents()) {
+					realizedInterfaces(component, parent, false, provideds);
 				}
 			}
 		}
 
-		for (Iterator ownedPorts = component.getOwnedPorts().iterator(); ownedPorts
-			.hasNext();) {
-
-			provideds.addAll(((InternalEList) ((Port) ownedPorts.next())
+		for (Port ownedPort : component.getOwnedPorts()) {
+			provideds.addAll(((InternalEList<Interface>) ownedPort
 				.getProvideds()).basicList());
 		}
 
-		return new UnionEObjectEList((InternalEObject) component,
+		return new UnionEObjectEList<Interface>((InternalEObject) component,
 			UMLPackage.Literals.COMPONENT__PROVIDED, provideds.size(),
 			provideds.toArray());
 	}
 
-	protected static EList getAllProvideds(Component component,
-			EList allProvideds) {
+	protected static EList<Interface> getAllProvideds(Component component,
+			EList<Interface> allProvideds) {
 		allProvideds.addAll(component.getProvideds());
 
-		for (Iterator allParents = component.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Object parent = allParents.next();
+		for (Classifier parent : component.allParents()) {
 
 			if (parent instanceof Component) {
 				allProvideds.addAll(((Component) parent).getProvideds());
 			} else {
-				realizedInterfaces(component, (Classifier) parent, true,
-					allProvideds);
+				realizedInterfaces(component, parent, true, allProvideds);
 			}
 		}
 
 		return allProvideds;
 	}
 
-	protected static EList getAllRequireds(Component component,
-			EList allRequireds) {
+	protected static EList<Interface> getAllRequireds(Component component,
+			EList<Interface> allRequireds) {
 		allRequireds.addAll(component.getRequireds());
 
-		for (Iterator allParents = component.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Object parent = allParents.next();
+		for (Classifier parent : component.allParents()) {
 
 			if (parent instanceof Component) {
 				allRequireds.addAll(((Component) parent).getRequireds());
 			} else {
-				usedInterfaces(component, (Classifier) parent, true,
-					allRequireds);
+				usedInterfaces(component, parent, true, allRequireds);
 			}
 		}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConditionalNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConditionalNodeOperations.java
index f160a5f..ac36e92 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConditionalNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConditionalNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConditionalNodeOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ConditionalNodeOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateResultNoIncoming(
 			ConditionalNode conditionalNode, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectableElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectableElementOperations.java
index e38a23f..5c8a029 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectableElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectableElementOperations.java
@@ -8,12 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectableElementOperations.java,v 1.3 2006/10/11 16:30:16 khussey Exp $
+ * $Id: ConnectableElementOperations.java,v 1.4 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
-
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.UniqueEList;
@@ -35,9 +33,9 @@
 		super();
 	}
 
-	protected static EList getRequiredInterfaces(
+	protected static EList<Interface> getRequiredInterfaces(
 			ConnectableElement connectableElement) {
-		EList requiredInterfaces = new UniqueEList.FastCompare();
+		EList<Interface> requiredInterfaces = new UniqueEList.FastCompare<Interface>();
 
 		if (connectableElement instanceof Port) {
 			requiredInterfaces.addAll(((Port) connectableElement)
@@ -53,11 +51,8 @@
 				ComponentOperations.usedInterfaces(null, classifier, true,
 					requiredInterfaces);
 
-				for (Iterator allParents = classifier.allParents().iterator(); allParents
-					.hasNext();) {
-
-					ComponentOperations.usedInterfaces(null,
-						(Classifier) allParents.next(), true,
+				for (Classifier parent : classifier.allParents()) {
+					ComponentOperations.usedInterfaces(null, parent, true,
 						requiredInterfaces);
 				}
 			}
@@ -65,13 +60,10 @@
 
 		for (int i = 0, size = requiredInterfaces.size(); i < size; i++) {
 
-			for (Iterator allParents = ((Interface) requiredInterfaces.get(i))
-				.allParents().iterator(); allParents.hasNext();) {
-
-				Object parent = allParents.next();
+			for (Classifier parent : requiredInterfaces.get(i).allParents()) {
 
 				if (parent instanceof Interface) {
-					requiredInterfaces.add(parent);
+					requiredInterfaces.add((Interface) parent);
 				}
 			}
 		}
@@ -79,9 +71,9 @@
 		return ECollections.unmodifiableEList(requiredInterfaces);
 	}
 
-	protected static EList getProvidedInterfaces(
+	protected static EList<Interface> getProvidedInterfaces(
 			ConnectableElement connectableElement) {
-		EList providedInterfaces = new UniqueEList.FastCompare();
+		EList<Interface> providedInterfaces = new UniqueEList.FastCompare<Interface>();
 
 		if (connectableElement instanceof Port) {
 			providedInterfaces.addAll(((Port) connectableElement)
@@ -93,17 +85,14 @@
 				ComponentOperations.getAllProvideds((Component) type,
 					providedInterfaces);
 			} else if (type instanceof Interface) {
-				providedInterfaces.add(type);
+				providedInterfaces.add((Interface) type);
 			} else if (type instanceof Classifier) {
 				Classifier classifier = (Classifier) type;
 				ComponentOperations.realizedInterfaces(null, classifier, true,
 					providedInterfaces);
 
-				for (Iterator allParents = classifier.allParents().iterator(); allParents
-					.hasNext();) {
-
-					ComponentOperations.realizedInterfaces(null,
-						(Classifier) allParents.next(), true,
+				for (Classifier parent : classifier.allParents()) {
+					ComponentOperations.realizedInterfaces(null, parent, true,
 						providedInterfaces);
 				}
 			}
@@ -111,13 +100,10 @@
 
 		for (int i = 0, size = providedInterfaces.size(); i < size; i++) {
 
-			for (Iterator allParents = ((Interface) providedInterfaces.get(i))
-				.allParents().iterator(); allParents.hasNext();) {
-
-				Object parent = allParents.next();
+			for (Classifier parent : providedInterfaces.get(i).allParents()) {
 
 				if (parent instanceof Interface) {
-					providedInterfaces.add(parent);
+					providedInterfaces.add((Interface) parent);
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectionPointReferenceOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectionPointReferenceOperations.java
index 00d18b1..8e73d6a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectionPointReferenceOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectionPointReferenceOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectionPointReferenceOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ConnectionPointReferenceOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateEntryPseudostates(
 			ConnectionPointReference connectionPointReference,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateExitPseudostates(
 			ConnectionPointReference connectionPointReference,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorEndOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorEndOperations.java
index 89cb2b5..e6543bd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorEndOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorEndOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorEndOperations.java,v 1.7 2006/02/23 17:36:26 khussey Exp $
+ * $Id: ConnectorEndOperations.java,v 1.8 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -69,7 +69,7 @@
 	 * @generated
 	 */
 	public static boolean validateMultiplicity(ConnectorEnd connectorEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -101,7 +101,7 @@
 	 * @generated
 	 */
 	public static boolean validatePartWithPortEmpty(ConnectorEnd connectorEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -133,7 +133,8 @@
 	 * @generated
 	 */
 	public static boolean validateRoleAndPartWithPort(
-			ConnectorEnd connectorEnd, DiagnosticChain diagnostics, Map context) {
+			ConnectorEnd connectorEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -165,7 +166,7 @@
 	 * @generated
 	 */
 	public static boolean validateSelfPartWithPort(ConnectorEnd connectorEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -200,13 +201,13 @@
 			Association type = connector.getType();
 
 			if (type != null) {
-				List ends = ((InternalEList) connector.getEnds()).basicList();
-				List memberEnds = ((InternalEList) type.getMemberEnds())
-					.basicList();
+				List<ConnectorEnd> ends = ((InternalEList<ConnectorEnd>) connector
+					.getEnds()).basicList();
+				List<Property> memberEnds = ((InternalEList<Property>) type
+					.getMemberEnds()).basicList();
 
 				if (ends.size() == memberEnds.size()) {
-					return (Property) memberEnds
-						.get(ends.indexOf(connectorEnd));
+					return memberEnds.get(ends.indexOf(connectorEnd));
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorOperations.java
index 245a0a2..e313803 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConnectorOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConnectorOperations.java,v 1.9 2006/05/08 18:10:37 khussey Exp $
+ * $Id: ConnectorOperations.java,v 1.10 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -28,6 +27,7 @@
 import org.eclipse.uml2.uml.ConnectorEnd;
 import org.eclipse.uml2.uml.ConnectorKind;
 import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Interface;
 import org.eclipse.uml2.uml.Port;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Type;
@@ -78,22 +78,22 @@
 	 * @generated NOT
 	 */
 	public static boolean validateTypes(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 		Association connectorType = connector.getType();
 
 		if (connectorType != null) {
-			Iterator ends = connector.getEnds().iterator();
-			Iterator memberEnds = connectorType.getMemberEnds().iterator();
+			Iterator<ConnectorEnd> ends = connector.getEnds().iterator();
+			Iterator<Property> memberEnds = connectorType.getMemberEnds()
+				.iterator();
 
 			while (ends.hasNext() && memberEnds.hasNext()) {
-				ConnectableElement role = ((ConnectorEnd) ends.next())
-					.getRole();
+				ConnectableElement role = ends.next().getRole();
 				Type type = role == null
 					? null
 					: role.getType();
 
-				Type memberEndType = ((Property) memberEnds.next()).getType();
+				Type memberEndType = memberEnds.next().getType();
 
 				if (type == null
 					? memberEndType != null
@@ -130,7 +130,7 @@
 	 * @generated
 	 */
 	public static boolean validateCompatible(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -162,11 +162,11 @@
 	 * @generated NOT
 	 */
 	public static boolean validateRoles(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
-		Iterator ends = connector.getEnds().iterator();
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		Iterator<ConnectorEnd> ends = connector.getEnds().iterator();
 
 		while (ends.hasNext()) {
-			ConnectorEnd end = (ConnectorEnd) ends.next();
+			ConnectorEnd end = ends.next();
 			ConnectableElement role = end.getRole();
 
 			Element owner = null;
@@ -210,22 +210,22 @@
 	 * @generated NOT
 	 */
 	public static boolean validateBetweenInterfacesPorts(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
-		EList ends = connector.getEnds();
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		EList<ConnectorEnd> ends = connector.getEnds();
 
 		if (connector.getKind() == ConnectorKind.DELEGATION_LITERAL
 			&& ends.size() == 2) {
 
-			ConnectableElement role1 = ((ConnectorEnd) ends.get(0)).getRole();
-			Collection required1 = ConnectableElementOperations
+			ConnectableElement role1 = ends.get(0).getRole();
+			EList<Interface> required1 = ConnectableElementOperations
 				.getRequiredInterfaces(role1);
-			Collection provided1 = ConnectableElementOperations
+			EList<Interface> provided1 = ConnectableElementOperations
 				.getProvidedInterfaces(role1);
 
-			ConnectableElement role2 = ((ConnectorEnd) ends.get(1)).getRole();
-			Collection required2 = ConnectableElementOperations
+			ConnectableElement role2 = ends.get(1).getRole();
+			EList<Interface> required2 = ConnectableElementOperations
 				.getRequiredInterfaces(role2);
-			Collection provided2 = ConnectableElementOperations
+			EList<Interface> provided2 = ConnectableElementOperations
 				.getProvidedInterfaces(role2);
 
 			if (intersect(provided2, required1)
@@ -258,19 +258,20 @@
 	 * @generated NOT
 	 */
 	public static boolean validateBetweenInterfacePortImplements(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
-		EList ends = connector.getEnds();
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		EList<ConnectorEnd> ends = connector.getEnds();
 
 		if (connector.getKind() == ConnectorKind.DELEGATION_LITERAL
 			&& ends.size() == 2) {
 
-			ConnectorEnd end1 = (ConnectorEnd) ends.get(0);
+			ConnectorEnd end1 = ends.get(0);
 			ConnectableElement role1 = end1.getRole();
 
-			ConnectorEnd end2 = (ConnectorEnd) ends.get(1);
+			ConnectorEnd end2 = ends.get(1);
 			ConnectableElement role2 = end2.getRole();
 
-			Collection provided1 = ConnectableElementOperations
+			EList<Interface> provided1 = ConnectableElementOperations
 				.getProvidedInterfaces(role1);
 
 			if (!provided1.isEmpty() && !(role2 instanceof Port)
@@ -315,23 +316,24 @@
 	 */
 
 	public static boolean validateBetweenInterfacePortSignature(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		boolean result = true;
-		EList ends = connector.getEnds();
+		EList<ConnectorEnd> ends = connector.getEnds();
 
 		if (connector.getKind() == ConnectorKind.DELEGATION_LITERAL
 			&& ends.size() == 2) {
 
-			ConnectableElement role1 = ((ConnectorEnd) ends.get(0)).getRole();
-			Collection required1 = ConnectableElementOperations
+			ConnectableElement role1 = ends.get(0).getRole();
+			EList<Interface> required1 = ConnectableElementOperations
 				.getRequiredInterfaces(role1);
-			Collection provided1 = ConnectableElementOperations
+			EList<Interface> provided1 = ConnectableElementOperations
 				.getProvidedInterfaces(role1);
 
-			ConnectableElement role2 = ((ConnectorEnd) ends.get(1)).getRole();
-			Collection required2 = ConnectableElementOperations
+			ConnectableElement role2 = ends.get(1).getRole();
+			EList<Interface> required2 = ConnectableElementOperations
 				.getRequiredInterfaces(role2);
-			Collection provided2 = ConnectableElementOperations
+			EList<Interface> provided2 = ConnectableElementOperations
 				.getProvidedInterfaces(role2);
 
 			if (!provided1.isEmpty() && !provided2.isEmpty()) {
@@ -369,7 +371,7 @@
 	 * @generated
 	 */
 	public static boolean validateUnionSignatureCompatible(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -401,22 +403,22 @@
 	 * @generated NOT
 	 */
 	public static boolean validateAssemblyConnector(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
-		EList ends = connector.getEnds();
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		EList<ConnectorEnd> ends = connector.getEnds();
 
 		if (connector.getKind() == ConnectorKind.ASSEMBLY_LITERAL
 			&& ends.size() == 2) {
 
-			ConnectableElement role1 = ((ConnectorEnd) ends.get(0)).getRole();
-			Collection required1 = ConnectableElementOperations
+			ConnectableElement role1 = ends.get(0).getRole();
+			EList<Interface> required1 = ConnectableElementOperations
 				.getRequiredInterfaces(role1);
-			Collection provided1 = ConnectableElementOperations
+			EList<Interface> provided1 = ConnectableElementOperations
 				.getProvidedInterfaces(role1);
 
-			ConnectableElement role2 = ((ConnectorEnd) ends.get(1)).getRole();
-			Collection required2 = ConnectableElementOperations
+			ConnectableElement role2 = ends.get(1).getRole();
+			EList<Interface> required2 = ConnectableElementOperations
 				.getRequiredInterfaces(role2);
-			Collection provided2 = ConnectableElementOperations
+			EList<Interface> provided2 = ConnectableElementOperations
 				.getProvidedInterfaces(role2);
 
 			if (!intersect(provided1, required2)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConsiderIgnoreFragmentOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConsiderIgnoreFragmentOperations.java
index e72be49..62ee4b7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConsiderIgnoreFragmentOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConsiderIgnoreFragmentOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConsiderIgnoreFragmentOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ConsiderIgnoreFragmentOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateConsiderOrIgnore(
 			ConsiderIgnoreFragment considerIgnoreFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateType(
 			ConsiderIgnoreFragment considerIgnoreFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConstraintOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConstraintOperations.java
index b176afa..e764ff5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConstraintOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ConstraintOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ConstraintOperations.java,v 1.5 2006/03/13 20:50:41 khussey Exp $
+ * $Id: ConstraintOperations.java,v 1.6 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateNotApplyToSelf(Constraint constraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (constraint.getConstrainedElements().contains(constraint)) {
@@ -93,7 +93,8 @@
 	 * @generated
 	 */
 	public static boolean validateValueSpecificationBoolean(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +126,7 @@
 	 * @generated
 	 */
 	public static boolean validateBooleanValue(Constraint constraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -157,7 +158,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoSideEffects(Constraint constraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -189,7 +190,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotAppliedToSelf(Constraint constraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ContinuationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ContinuationOperations.java
index 55f1c8d..26d3f0f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ContinuationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ContinuationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ContinuationOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ContinuationOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameName(Continuation continuation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateGlobal(Continuation continuation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,8 @@
 	 * @generated
 	 */
 	public static boolean validateFirstOrLastInteractionFragment(
-			Continuation continuation, DiagnosticChain diagnostics, Map context) {
+			Continuation continuation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ControlFlowOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ControlFlowOperations.java
index e4c935d..8dc1573 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ControlFlowOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ControlFlowOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ControlFlowOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ControlFlowOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateObjectNodes(ControlFlow controlFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkActionOperations.java
index f5127f6..c7904ac 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: CreateLinkActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateAssociationNotAbstract(
 			CreateLinkAction createLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkObjectActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkObjectActionOperations.java
index 67d0f42..20a8162 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkObjectActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateLinkObjectActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateLinkObjectActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: CreateLinkObjectActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateAssociationClass(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateTypeOfResult(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -127,7 +127,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateObjectActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateObjectActionOperations.java
index 3ebe70d..512e6ed 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateObjectActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreateObjectActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreateObjectActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: CreateObjectActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateClassifierNotAbstract(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateClassifierNotAssociationClass(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateSameType(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -161,7 +161,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreationEventOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreationEventOperations.java
index 9360e2c..7a24900 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreationEventOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/CreationEventOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: CreationEventOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: CreationEventOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateNoOccurrenceAbove(
 			CreationEvent creationEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DataTypeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DataTypeOperations.java
index 28899d8..66a9c4b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DataTypeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DataTypeOperations.java
@@ -8,16 +8,16 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DataTypeOperations.java,v 1.10 2006/03/07 20:25:17 khussey Exp $
+ * $Id: DataTypeOperations.java,v 1.11 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 
-import java.util.Iterator;
 import org.eclipse.emf.common.util.UniqueEList;
 import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Type;
@@ -58,8 +58,8 @@
 	 * @generated NOT
 	 */
 	public static Operation createOwnedOperation(DataType dataType,
-			String name, EList parameterNames, EList parameterTypes,
-			Type returnType) {
+			String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType) {
 		return TypeOperations.createOwnedOperation(dataType, name,
 			parameterNames, parameterTypes, returnType);
 	}
@@ -84,15 +84,12 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList inherit(DataType dataType, EList inhs) {
-		EList inherit = new UniqueEList.FastCompare();
+	public static EList<NamedElement> inherit(DataType dataType,
+			EList<NamedElement> inhs) {
+		EList<NamedElement> inherit = new UniqueEList.FastCompare<NamedElement>();
+		EList<NamedElement> redefinedElements = new UniqueEList.FastCompare<NamedElement>();
 
-		EList redefinedElements = new UniqueEList.FastCompare();
-
-		for (Iterator ownedMembers = dataType.getOwnedMembers().iterator(); ownedMembers
-			.hasNext();) {
-
-			Object ownedMember = ownedMembers.next();
+		for (NamedElement ownedMember : dataType.getOwnedMembers()) {
 
 			if (ownedMember instanceof RedefinableElement) {
 				redefinedElements.addAll(((RedefinableElement) ownedMember)
@@ -100,8 +97,7 @@
 			}
 		}
 
-		for (Iterator i = inhs.iterator(); i.hasNext();) {
-			Object inh = i.next();
+		for (NamedElement inh : inhs) {
 
 			if (!redefinedElements.contains(inh)) {
 				inherit.add(inh);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DecisionNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DecisionNodeOperations.java
index 3ee4c60..7e85b3b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DecisionNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DecisionNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DecisionNodeOperations.java,v 1.5 2006/03/28 18:26:14 khussey Exp $
+ * $Id: DecisionNodeOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateOneIncomingEdge(DecisionNode decisionNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (decisionNode.getIncomings().size() != 1) {
 
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateInputParameter(DecisionNode decisionNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -123,7 +123,7 @@
 	 * @generated
 	 */
 	public static boolean validateEdges(DecisionNode decisionNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentSpecificationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentSpecificationOperations.java
index 5a15972..634fde7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentSpecificationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentSpecificationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentSpecificationOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: DeploymentSpecificationOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateDeployedElements(
 			DeploymentSpecification deploymentSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateDeploymentTarget(
 			DeploymentSpecification deploymentSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentTargetOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentTargetOperations.java
index d9dad71..38b7808 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentTargetOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DeploymentTargetOperations.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DeploymentTargetOperations.java,v 1.7 2006/01/27 04:55:56 khussey Exp $
+ * $Id: DeploymentTargetOperations.java,v 1.8 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
 import org.eclipse.emf.common.util.EList;
 
-import java.util.Iterator;
 import org.eclipse.emf.common.util.UniqueEList;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.uml2.common.util.UnionEObjectEList;
@@ -60,26 +59,21 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getDeployedElements(DeploymentTarget deploymentTarget) {
-		EList deployedElements = new UniqueEList.FastCompare();
+	public static EList<PackageableElement> getDeployedElements(
+			DeploymentTarget deploymentTarget) {
+		EList<PackageableElement> deployedElements = new UniqueEList.FastCompare<PackageableElement>();
 
-		for (Iterator deployments = deploymentTarget.getDeployments()
-			.iterator(); deployments.hasNext();) {
+		for (Deployment deployment : deploymentTarget.getDeployments()) {
 
-			for (Iterator deployedArtifacts = ((Deployment) deployments.next())
-				.getDeployedArtifacts().iterator(); deployedArtifacts.hasNext();) {
-
-				DeployedArtifact deployedArtifact = (DeployedArtifact) deployedArtifacts
-					.next();
+			for (DeployedArtifact deployedArtifact : deployment
+				.getDeployedArtifacts()) {
 
 				if (deployedArtifact instanceof Artifact) {
 
-					for (Iterator manifestations = ((Artifact) deployedArtifact)
-						.getManifestations().iterator(); manifestations
-						.hasNext();) {
+					for (Manifestation manifestation : ((Artifact) deployedArtifact)
+						.getManifestations()) {
 
-						PackageableElement utilizedElement = (PackageableElement) ((Manifestation) manifestations
-							.next())
+						PackageableElement utilizedElement = (PackageableElement) manifestation
 							.eGet(
 								UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT,
 								false);
@@ -92,7 +86,8 @@
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) deploymentTarget,
+		return new UnionEObjectEList<PackageableElement>(
+			(InternalEObject) deploymentTarget,
 			UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT,
 			deployedElements.size(), deployedElements.toArray());
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestroyObjectActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestroyObjectActionOperations.java
index a7bd954..1d3a215 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestroyObjectActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestroyObjectActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestroyObjectActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: DestroyObjectActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			DestroyObjectAction destroyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateNoType(
 			DestroyObjectAction destroyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestructionEventOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestructionEventOperations.java
index 96fac3c..059fcea 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestructionEventOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DestructionEventOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DestructionEventOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: DestructionEventOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateNoOccurrenceSpecificationsBelow(
 			DestructionEvent destructionEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationConstraintOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationConstraintOperations.java
index 439dc29..cb54a4c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationConstraintOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationConstraintOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationConstraintOperations.java,v 1.4 2006/04/05 13:50:02 khussey Exp $
+ * $Id: DurationConstraintOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateFirstEventMultiplicity(
 			DurationConstraint durationConstraint, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationObservationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationObservationOperations.java
index 4a1a7c0..7fc713f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationObservationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/DurationObservationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: DurationObservationOperations.java,v 1.4 2006/04/05 13:50:03 khussey Exp $
+ * $Id: DurationObservationOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateFirstEventMultiplicity(
 			DurationObservation durationObservation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementImportOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementImportOperations.java
index de4d54f..a4a0d31 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementImportOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementImportOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ElementImportOperations.java,v 1.7 2006/03/15 19:34:24 khussey Exp $
+ * $Id: ElementImportOperations.java,v 1.8 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -64,7 +64,7 @@
 	 */
 	public static boolean validateVisibilityPublicOrPrivate(
 			ElementImport elementImport, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = true;
 
 		VisibilityKind visibility = elementImport.getVisibility();
@@ -102,7 +102,7 @@
 	 */
 	public static boolean validateImportedElementIsPublic(
 			ElementImport elementImport, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = true;
 
 		PackageableElement importedElement = elementImport.getImportedElement();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementOperations.java
index 5972690..d9c70b3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ElementOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ElementOperations.java,v 1.47 2006/10/25 18:12:15 khussey Exp $
+ * $Id: ElementOperations.java,v 1.48 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -27,6 +27,7 @@
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.UniqueEList;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -51,6 +52,7 @@
 import org.eclipse.uml2.uml.EnumerationLiteral;
 import org.eclipse.uml2.uml.Extension;
 import org.eclipse.uml2.uml.Model;
+import org.eclipse.uml2.uml.Relationship;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Profile;
 import org.eclipse.uml2.uml.ProfileApplication;
@@ -127,7 +129,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateNotOwnSelf(Element element,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (EcoreUtil.isAncestor(element, element.getOwner())) {
@@ -156,7 +158,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateHasOwner(Element element,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (element.mustBeOwned() && element.getOwner() == null) {
@@ -180,14 +182,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getStereotypeApplications(Element element) {
-		EList stereotypeApplications = new UniqueEList.FastCompare();
+	public static EList<EObject> getStereotypeApplications(Element element) {
+		EList<EObject> stereotypeApplications = new UniqueEList.FastCompare<EObject>();
 
-		for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-			element).iterator(); nonNavigableInverseReferences.hasNext();) {
-
-			EStructuralFeature.Setting setting = (EStructuralFeature.Setting) nonNavigableInverseReferences
-				.next();
+		for (EStructuralFeature.Setting setting : getNonNavigableInverseReferences(element)) {
 
 			if (setting.getEStructuralFeature().getName().startsWith(
 				Extension.METACLASS_ROLE_PREFIX)) {
@@ -211,12 +209,8 @@
 	public static EObject getStereotypeApplication(Element element,
 			Stereotype stereotype) {
 
-		for (Iterator stereotypeApplications = element
-			.getStereotypeApplications().iterator(); stereotypeApplications
-			.hasNext();) {
-
-			EObject stereotypeApplication = (EObject) stereotypeApplications
-				.next();
+		for (EObject stereotypeApplication : element
+			.getStereotypeApplications()) {
 
 			if (getStereotype(stereotypeApplication) == stereotype) {
 				return stereotypeApplication;
@@ -231,28 +225,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getRequiredStereotypes(Element element) {
+	public static EList<Stereotype> getRequiredStereotypes(Element element) {
 		org.eclipse.uml2.uml.Package package_ = element.getNearestPackage();
 
 		if (package_ != null) {
-			EList requiredStereotypes = new UniqueEList.FastCompare();
+			EList<Stereotype> requiredStereotypes = new UniqueEList.FastCompare<Stereotype>();
 
-			for (Iterator allProfileApplications = package_
-				.getAllProfileApplications().iterator(); allProfileApplications
-				.hasNext();) {
+			for (ProfileApplication profileApplication : package_
+				.getAllProfileApplications()) {
 
-				ProfileApplication profileApplication = (ProfileApplication) allProfileApplications
-					.next();
 				Profile appliedProfile = profileApplication.getAppliedProfile();
 
 				if (appliedProfile != null) {
 
-					for (Iterator ownedStereotypes = appliedProfile
-						.getOwnedStereotypes().iterator(); ownedStereotypes
-						.hasNext();) {
+					for (Stereotype stereotype : appliedProfile
+						.getOwnedStereotypes()) {
 
-						Stereotype stereotype = (Stereotype) ownedStereotypes
-							.next();
 						ENamedElement appliedDefinition = profileApplication
 							.getAppliedDefinition(stereotype);
 
@@ -273,7 +261,7 @@
 			return ECollections.unmodifiableEList(requiredStereotypes);
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.emptyEList();
 	}
 
 	/**
@@ -284,11 +272,7 @@
 	public static Stereotype getRequiredStereotype(Element element,
 			String qualifiedName) {
 
-		for (Iterator requiredStereotypes = element.getRequiredStereotypes()
-			.iterator(); requiredStereotypes.hasNext();) {
-
-			Stereotype requiredStereotype = (Stereotype) requiredStereotypes
-				.next();
+		for (Stereotype requiredStereotype : element.getRequiredStereotypes()) {
 
 			if (safeEquals(requiredStereotype.getQualifiedName(), qualifiedName)) {
 				return requiredStereotype;
@@ -303,14 +287,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAppliedStereotypes(Element element) {
-		EList appliedStereotypes = new UniqueEList.FastCompare();
+	public static EList<Stereotype> getAppliedStereotypes(Element element) {
+		EList<Stereotype> appliedStereotypes = new UniqueEList.FastCompare<Stereotype>();
 
-		for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-			element).iterator(); nonNavigableInverseReferences.hasNext();) {
-
-			EStructuralFeature.Setting setting = (EStructuralFeature.Setting) nonNavigableInverseReferences
-				.next();
+		for (EStructuralFeature.Setting setting : getNonNavigableInverseReferences(element)) {
 
 			if (setting.getEStructuralFeature().getName().startsWith(
 				Extension.METACLASS_ROLE_PREFIX)) {
@@ -334,11 +314,7 @@
 	public static Stereotype getAppliedStereotype(Element element,
 			String qualifiedName) {
 
-		for (Iterator appliedStereotypes = element.getAppliedStereotypes()
-			.iterator(); appliedStereotypes.hasNext();) {
-
-			Stereotype appliedStereotype = (Stereotype) appliedStereotypes
-				.next();
+		for (Stereotype appliedStereotype : element.getAppliedStereotypes()) {
 
 			if (safeEquals(appliedStereotype.getQualifiedName(), qualifiedName)) {
 				return appliedStereotype;
@@ -353,15 +329,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAppliedSubstereotypes(Element element,
+	public static EList<Stereotype> getAppliedSubstereotypes(Element element,
 			Stereotype stereotype) {
-		EList appliedSubstereotypes = new UniqueEList.FastCompare();
+		EList<Stereotype> appliedSubstereotypes = new UniqueEList.FastCompare<Stereotype>();
 
-		for (Iterator appliedStereotypes = element.getAppliedStereotypes()
-			.iterator(); appliedStereotypes.hasNext();) {
-
-			Stereotype appliedStereotype = (Stereotype) appliedStereotypes
-				.next();
+		for (Stereotype appliedStereotype : element.getAppliedStereotypes()) {
 
 			if (appliedStereotype.allParents().contains(stereotype)) {
 				appliedSubstereotypes.add(appliedStereotype);
@@ -379,11 +351,8 @@
 	public static Stereotype getAppliedSubstereotype(Element element,
 			Stereotype stereotype, String qualifiedName) {
 
-		for (Iterator appliedSubstereotypes = element.getAppliedSubstereotypes(
-			stereotype).iterator(); appliedSubstereotypes.hasNext();) {
-
-			Stereotype appliedSubstereotype = (Stereotype) appliedSubstereotypes
-				.next();
+		for (Stereotype appliedSubstereotype : element
+			.getAppliedSubstereotypes(stereotype)) {
 
 			if (safeEquals(appliedSubstereotype.getQualifiedName(),
 				qualifiedName)) {
@@ -451,9 +420,11 @@
 					} else {
 
 						if (eStructuralFeature.isMany()) {
-							List list = eObject == null
-								? Collections.EMPTY_LIST
-								: (List) eObject.eGet(eStructuralFeature);
+							@SuppressWarnings("unchecked")
+							List<Object> list = eObject == null
+								? Collections.emptyList()
+								: (List<Object>) eObject
+									.eGet(eStructuralFeature);
 
 							return index == -1
 								? !list.isEmpty()
@@ -544,9 +515,10 @@
 				Object value = null;
 
 				if (eStructuralFeature.isMany()) {
-					List list = eObject == null
-						? Collections.EMPTY_LIST
-						: (List) eObject.eGet(eStructuralFeature);
+					@SuppressWarnings("unchecked")
+					List<Object> list = eObject == null
+						? Collections.emptyList()
+						: (List<Object>) eObject.eGet(eStructuralFeature);
 
 					value = index == -1
 						? list
@@ -562,7 +534,7 @@
 						.getEAnnotation(UMLPackage.eNS_URI);
 
 					if (eAnnotation != null) {
-						EList references = eAnnotation.getReferences();
+						EList<EObject> references = eAnnotation.getReferences();
 
 						if (references.size() > 0) {
 							Object reference = references.get(0);
@@ -646,7 +618,9 @@
 				eClass = (EClass) eType;
 
 				if (eStructuralFeature.isMany()) {
-					List list = (List) eObject.eGet(eStructuralFeature);
+					@SuppressWarnings("unchecked")
+					List<Object> list = (List<Object>) eObject
+						.eGet(eStructuralFeature);
 					int size = list.size();
 
 					if (size <= index) {
@@ -686,9 +660,11 @@
 						EClass eClassType = (EClass) eType;
 
 						if (newValue instanceof List) {
+							@SuppressWarnings("unchecked")
+							Iterator<Object> j = ((List<Object>) newValue)
+								.iterator();
 
-							for (Iterator j = ((List) newValue).iterator(); j
-								.hasNext();) {
+							while (j.hasNext()) {
 
 								if (!eClassType.isInstance(j.next())) {
 									throw new IllegalArgumentException(String
@@ -705,12 +681,14 @@
 							.getEFactoryInstance();
 
 						if (newValue instanceof List) {
-							newValue = new ArrayList((List) newValue);
+							@SuppressWarnings("unchecked")
+							List<Object> newList = new ArrayList<Object>(
+								(List<Object>) newValue);
 
 							if (eDataType instanceof EEnum) {
 								EEnum eEnum = (EEnum) eDataType;
 
-								for (ListIterator li = ((List) newValue)
+								for (ListIterator<Object> li = newList
 									.listIterator(); li.hasNext();) {
 
 									Object item = li.next();
@@ -723,7 +701,7 @@
 								}
 							}
 
-							for (ListIterator li = ((List) newValue)
+							for (ListIterator<Object> li = newList
 								.listIterator(); li.hasNext();) {
 
 								Object item = li.next();
@@ -739,6 +717,8 @@
 									}
 								}
 							}
+
+							newValue = newList;
 						} else {
 
 							if (eDataType instanceof EEnum) {
@@ -780,7 +760,9 @@
 								.valueOf(newValue));
 						}
 					} else {
-						List list = (List) eObject.eGet(eStructuralFeature);
+						@SuppressWarnings("unchecked")
+						List<Object> list = (List<Object>) eObject
+							.eGet(eStructuralFeature);
 
 						for (int j = list.size(); j < index; j++) {
 							list.add(j, eStructuralFeature.getDefaultValue());
@@ -814,7 +796,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getRelationships(Element element) {
+	public static EList<Relationship> getRelationships(Element element) {
 		return getRelationships(element, UMLPackage.Literals.RELATIONSHIP);
 	}
 
@@ -823,18 +805,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getRelationships(Element element, EClass eClass) {
-		EList relationships = new UniqueEList.FastCompare();
+	public static EList<Relationship> getRelationships(Element element,
+			EClass eClass) {
+		EList<Relationship> relationships = new UniqueEList.FastCompare<Relationship>();
 
-		for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-			element).iterator(); nonNavigableInverseReferences.hasNext();) {
+		for (EStructuralFeature.Setting setting : getNonNavigableInverseReferences(element)) {
 
-			EStructuralFeature.Setting setting = (EStructuralFeature.Setting) nonNavigableInverseReferences
-				.next();
 			EObject eObject = setting.getEObject();
 
 			if (eClass.isInstance(eObject)) {
-				relationships.add(eObject);
+				relationships.add((Relationship) eObject);
 			} else if (eObject instanceof Property) {
 				Association association = ((Property) eObject).getAssociation();
 
@@ -844,10 +824,7 @@
 			}
 		}
 
-		for (Iterator eAllReferences = element.eClass().getEAllReferences()
-			.iterator(); eAllReferences.hasNext();) {
-
-			EReference eReference = (EReference) eAllReferences.next();
+		for (EReference eReference : element.eClass().getEAllReferences()) {
 
 			if (!eReference.isDerived() && element.eIsSet(eReference)) {
 				EClass eReferenceType = eReference.getEReferenceType();
@@ -855,26 +832,30 @@
 				if (eClass.isSuperTypeOf(eReferenceType)) {
 
 					if (eReference.isMany()) {
-						relationships.addAll((List) element.eGet(eReference));
+						@SuppressWarnings("unchecked")
+						List<Relationship> values = (List<Relationship>) element
+							.eGet(eReference);
+						relationships.addAll(values);
 					} else {
-						relationships.add(element.eGet(eReference));
+						relationships.add((Relationship) element
+							.eGet(eReference));
 					}
 				} else if (eReferenceType.isSuperTypeOf(eClass)) {
 					Object value = element.eGet(eReference);
 
 					if (eReference.isMany()) {
+						@SuppressWarnings("unchecked")
+						Iterator<Object> i = ((List<Object>) value).iterator();
 
-						for (Iterator i = ((List) value).iterator(); i
-							.hasNext();) {
-
+						while (i.hasNext()) {
 							value = i.next();
 
 							if (eClass.isInstance(value)) {
-								relationships.add(value);
+								relationships.add((Relationship) value);
 							}
 						}
 					} else if (eClass.isInstance(value)) {
-						relationships.add(value);
+						relationships.add((Relationship) value);
 					}
 				}
 			}
@@ -888,7 +869,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getSourceDirectedRelationships(Element element) {
+	public static EList<DirectedRelationship> getSourceDirectedRelationships(
+			Element element) {
 		return getSourceDirectedRelationships(element,
 			UMLPackage.Literals.DIRECTED_RELATIONSHIP);
 	}
@@ -898,12 +880,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getSourceDirectedRelationships(Element element,
-			EClass eClass) {
-		EList sourceDirectedRelationships = new UniqueEList.FastCompare();
+	public static EList<DirectedRelationship> getSourceDirectedRelationships(
+			Element element, EClass eClass) {
+		EList<DirectedRelationship> sourceDirectedRelationships = new UniqueEList.FastCompare<DirectedRelationship>();
 
-		for (Iterator directedRelationships = getRelationships(element, eClass)
-			.iterator(); directedRelationships.hasNext();) {
+		for (Iterator<Relationship> directedRelationships = getRelationships(
+			element, eClass).iterator(); directedRelationships.hasNext();) {
 
 			DirectedRelationship directedRelationship = (DirectedRelationship) directedRelationships
 				.next();
@@ -921,7 +903,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getTargetDirectedRelationships(Element element) {
+	public static EList<DirectedRelationship> getTargetDirectedRelationships(
+			Element element) {
 		return getTargetDirectedRelationships(element,
 			UMLPackage.Literals.DIRECTED_RELATIONSHIP);
 	}
@@ -931,12 +914,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getTargetDirectedRelationships(Element element,
-			EClass eClass) {
-		EList targetDirectedRelationships = new UniqueEList.FastCompare();
+	public static EList<DirectedRelationship> getTargetDirectedRelationships(
+			Element element, EClass eClass) {
+		EList<DirectedRelationship> targetDirectedRelationships = new UniqueEList.FastCompare<DirectedRelationship>();
 
-		for (Iterator directedRelationships = getRelationships(element, eClass)
-			.iterator(); directedRelationships.hasNext();) {
+		for (Iterator<Relationship> directedRelationships = getRelationships(
+			element, eClass).iterator(); directedRelationships.hasNext();) {
 
 			DirectedRelationship directedRelationship = (DirectedRelationship) directedRelationships
 				.next();
@@ -954,24 +937,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getKeywords(Element element) {
+	public static EList<String> getKeywords(Element element) {
 		EAnnotation eAnnotation = element.getEAnnotation(UMLPackage.eNS_URI);
 
 		if (eAnnotation != null) {
-			EMap details = eAnnotation.getDetails();
+			EMap<String, String> details = eAnnotation.getDetails();
 
 			if (!details.isEmpty()) {
-				EList keywords = new UniqueEList();
+				EList<String> keywords = new UniqueEList<String>();
 
-				for (Iterator d = details.iterator(); d.hasNext();) {
-					keywords.add(((Map.Entry) d.next()).getKey());
+				for (Iterator<Map.Entry<String, String>> d = details.iterator(); d
+					.hasNext();) {
+
+					keywords.add(d.next().getKey());
 				}
 
 				return ECollections.unmodifiableEList(keywords);
 			}
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.emptyEList();
 	}
 
 	/**
@@ -980,8 +965,8 @@
 	 * @generated NOT
 	 */
 	public static boolean addKeyword(Element element, String keyword) {
-		EMap details = getEAnnotation(element, UMLPackage.eNS_URI, true)
-			.getDetails();
+		EMap<String, String> details = getEAnnotation(element,
+			UMLPackage.eNS_URI, true).getDetails();
 
 		if (!details.containsKey(keyword)) {
 			details.put(keyword, null);
@@ -1000,7 +985,7 @@
 		EAnnotation eAnnotation = element.getEAnnotation(UMLPackage.eNS_URI);
 
 		if (eAnnotation != null) {
-			EMap details = eAnnotation.getDetails();
+			EMap<String, String> details = eAnnotation.getDetails();
 
 			if (details.containsKey(keyword)) {
 				details.removeKey(keyword);
@@ -1052,10 +1037,7 @@
 	protected static Extension getExtension(Element element,
 			Stereotype stereotype) {
 
-		for (Iterator allAttributes = stereotype.getAllAttributes().iterator(); allAttributes
-			.hasNext();) {
-
-			Property attribute = (Property) allAttributes.next();
+		for (Property attribute : stereotype.getAllAttributes()) {
 			Association association = attribute.getAssociation();
 
 			if (association instanceof Extension) {
@@ -1153,33 +1135,25 @@
 		return element.getStereotypeApplication(stereotype) != null;
 	}
 
-	protected static EList applyAllStereotypes(Element element,
-			Map definitions, EList stereotypeApplications) {
+	protected static EList<EObject> applyAllStereotypes(Element element,
+			Map<EClassifier, Map<Stereotype, EClass>> definitions,
+			EList<EObject> stereotypeApplications) {
 
 		if (!element.eIsProxy()) {
 
-			for (Iterator stereotypeEntries = definitions.entrySet().iterator(); stereotypeEntries
-				.hasNext();) {
+			for (Map.Entry<EClassifier, Map<Stereotype, EClass>> stereotypeEntry : definitions
+				.entrySet()) {
 
-				Map.Entry stereotypeEntry = (Map.Entry) stereotypeEntries
-					.next();
+				if (stereotypeEntry.getKey().isInstance(element)) {
 
-				if (((EClassifier) stereotypeEntry.getKey())
-					.isInstance(element)) {
+					for (Map.Entry<Stereotype, EClass> definitionEntry : stereotypeEntry
+						.getValue().entrySet()) {
 
-					for (Iterator definitionEntries = ((Map) stereotypeEntry
-						.getValue()).entrySet().iterator(); definitionEntries
-						.hasNext();) {
-
-						Map.Entry definitionEntry = (Map.Entry) definitionEntries
-							.next();
-
-						if (!element
-							.isStereotypeApplied((Stereotype) definitionEntry
-								.getKey())) {
+						if (!element.isStereotypeApplied(definitionEntry
+							.getKey())) {
 
 							stereotypeApplications.add(applyStereotype(element,
-								(EClass) definitionEntry.getValue()));
+								definitionEntry.getValue()));
 						}
 					}
 				}
@@ -1189,18 +1163,19 @@
 		return stereotypeApplications;
 	}
 
-	protected static EList applyAllStereotypes(Element element,
-			Map definitions, boolean resolve) {
-		EList stereotypeApplications = new UniqueEList.FastCompare();
+	protected static EList<EObject> applyAllStereotypes(Element element,
+			Map<EClassifier, Map<Stereotype, EClass>> definitions,
+			boolean resolve) {
+		EList<EObject> stereotypeApplications = new UniqueEList.FastCompare<EObject>();
 
 		applyAllStereotypes(element, definitions, stereotypeApplications);
 
 		if (!element.eContents().isEmpty()) {
 
-			for (Iterator allContents = EcoreUtil.getAllContents(element,
-				resolve); allContents.hasNext();) {
+			for (TreeIterator<EObject> allContents = EcoreUtil.getAllContents(
+				element, resolve); allContents.hasNext();) {
 
-				EObject eObject = (EObject) allContents.next();
+				EObject eObject = allContents.next();
 
 				if (eObject instanceof Element) {
 					applyAllStereotypes((Element) eObject, definitions,
@@ -1212,33 +1187,27 @@
 		return stereotypeApplications;
 	}
 
-	public static EList applyAllRequiredStereotypes(Element element) {
+	public static EList<EObject> applyAllRequiredStereotypes(Element element) {
 		return applyAllRequiredStereotypes(element, true);
 	}
 
-	public static EList applyAllRequiredStereotypes(Element element,
+	public static EList<EObject> applyAllRequiredStereotypes(Element element,
 			boolean resolve) {
 		org.eclipse.uml2.uml.Package package_ = element.getNearestPackage();
 
 		if (package_ != null) {
-			Map definitions = new HashMap();
+			Map<EClassifier, Map<Stereotype, EClass>> definitions = new HashMap<EClassifier, Map<Stereotype, EClass>>();
 
-			for (Iterator allProfileApplications = package_
-				.getAllProfileApplications().iterator(); allProfileApplications
-				.hasNext();) {
+			for (ProfileApplication profileApplication : package_
+				.getAllProfileApplications()) {
 
-				ProfileApplication profileApplication = (ProfileApplication) allProfileApplications
-					.next();
 				Profile appliedProfile = profileApplication.getAppliedProfile();
 
 				if (appliedProfile != null) {
 
-					for (Iterator ownedExtensions = appliedProfile
-						.getOwnedExtensions(true).iterator(); ownedExtensions
-						.hasNext();) {
+					for (Extension ownedExtension : appliedProfile
+						.getOwnedExtensions(true)) {
 
-						Extension ownedExtension = (Extension) ownedExtensions
-							.next();
 						org.eclipse.uml2.uml.Class metaclass = ownedExtension
 							.getMetaclass();
 
@@ -1257,19 +1226,21 @@
 										&& !((EClass) appliedDefinition)
 											.isAbstract()) {
 
-										Map stereotypes = (Map) definitions
+										Map<Stereotype, EClass> stereotypes = definitions
 											.get(eClassifier);
 
 										if (stereotypes == null) {
-											definitions.put(eClassifier,
-												stereotypes = new HashMap());
+											definitions
+												.put(
+													eClassifier,
+													stereotypes = new HashMap<Stereotype, EClass>());
 										}
 
 										if (!stereotypes
 											.containsKey(stereotype)) {
 
 											stereotypes.put(stereotype,
-												appliedDefinition);
+												(EClass) appliedDefinition);
 										}
 									}
 								}
@@ -1284,7 +1255,7 @@
 			}
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.emptyEList();
 	}
 
 	/**
@@ -1304,15 +1275,13 @@
 		return applyStereotype(element, definition);
 	}
 
-	protected static EList unapplyAllNonApplicableStereotypes(Element element,
-			EList nonApplicableStereotypes) {
+	protected static EList<EObject> unapplyAllNonApplicableStereotypes(
+			Element element, EList<EObject> nonApplicableStereotypes) {
 
 		if (!element.eIsProxy()) {
 
-			for (Iterator sa = element.getStereotypeApplications().iterator(); sa
-				.hasNext();) {
-
-				EObject stereotypeApplication = (EObject) sa.next();
+			for (EObject stereotypeApplication : element
+				.getStereotypeApplications()) {
 
 				if (!element
 					.isStereotypeApplicable(getStereotype(stereotypeApplication))) {
@@ -1327,22 +1296,23 @@
 		return nonApplicableStereotypes;
 	}
 
-	public static EList unapplyAllNonApplicableStereotypes(Element element) {
+	public static EList<EObject> unapplyAllNonApplicableStereotypes(
+			Element element) {
 		return unapplyAllNonApplicableStereotypes(element, true);
 	}
 
-	public static EList unapplyAllNonApplicableStereotypes(Element element,
-			boolean resolve) {
-		EList nonApplicableStereotypes = new UniqueEList.FastCompare();
+	public static EList<EObject> unapplyAllNonApplicableStereotypes(
+			Element element, boolean resolve) {
+		EList<EObject> nonApplicableStereotypes = new UniqueEList.FastCompare<EObject>();
 
 		unapplyAllNonApplicableStereotypes(element, nonApplicableStereotypes);
 
 		if (!element.eContents().isEmpty()) {
 
-			for (Iterator allContents = EcoreUtil.getAllContents(element,
-				resolve); allContents.hasNext();) {
+			for (TreeIterator<EObject> allContents = EcoreUtil.getAllContents(
+				element, resolve); allContents.hasNext();) {
 
-				EObject eObject = (EObject) allContents.next();
+				EObject eObject = allContents.next();
 
 				if (eObject instanceof Element) {
 					unapplyAllNonApplicableStereotypes((Element) eObject,
@@ -1383,28 +1353,22 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getApplicableStereotypes(Element element) {
+	public static EList<Stereotype> getApplicableStereotypes(Element element) {
 		org.eclipse.uml2.uml.Package package_ = element.getNearestPackage();
 
 		if (package_ != null) {
-			EList applicableStereotypes = new UniqueEList.FastCompare();
+			EList<Stereotype> applicableStereotypes = new UniqueEList.FastCompare<Stereotype>();
 
-			for (Iterator allProfileApplications = package_
-				.getAllProfileApplications().iterator(); allProfileApplications
-				.hasNext();) {
+			for (ProfileApplication profileApplication : package_
+				.getAllProfileApplications()) {
 
-				ProfileApplication profileApplication = (ProfileApplication) allProfileApplications
-					.next();
 				Profile appliedProfile = profileApplication.getAppliedProfile();
 
 				if (appliedProfile != null) {
 
-					for (Iterator ownedStereotypes = appliedProfile
-						.getOwnedStereotypes().iterator(); ownedStereotypes
-						.hasNext();) {
+					for (Stereotype stereotype : appliedProfile
+						.getOwnedStereotypes()) {
 
-						Stereotype stereotype = (Stereotype) ownedStereotypes
-							.next();
 						ENamedElement appliedDefinition = profileApplication
 							.getAppliedDefinition(stereotype);
 
@@ -1421,7 +1385,7 @@
 			return ECollections.unmodifiableEList(applicableStereotypes);
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.emptyEList();
 	}
 
 	/**
@@ -1432,12 +1396,8 @@
 	public static Stereotype getApplicableStereotype(Element element,
 			String qualifiedName) {
 
-		for (Iterator applicableStereotypes = element
-			.getApplicableStereotypes().iterator(); applicableStereotypes
-			.hasNext();) {
-
-			Stereotype applicableStereotype = (Stereotype) applicableStereotypes
-				.next();
+		for (Stereotype applicableStereotype : element
+			.getApplicableStereotypes()) {
 
 			if (safeEquals(applicableStereotype.getQualifiedName(),
 				qualifiedName)) {
@@ -1484,20 +1444,20 @@
 			}
 		} else {
 
-			for (Iterator allContents = getAllContents(ancestorEObject, true,
-				false); allContents.hasNext();) {
+			for (TreeIterator<EObject> allContents = getAllContents(
+				ancestorEObject, true, false); allContents.hasNext();) {
 
-				Object object = allContents.next();
+				EObject eObject = allContents.next();
 
-				if (object instanceof Element) {
-					destroyAll(((Element) object).getStereotypeApplications());
+				if (eObject instanceof Element) {
+					destroyAll(((Element) eObject).getStereotypeApplications());
 				}
 			}
 
-			for (Iterator allContents = getAllContents(ancestorEObject, true,
-				false); allContents.hasNext();) {
+			for (TreeIterator<EObject> allContents = getAllContents(
+				ancestorEObject, true, false); allContents.hasNext();) {
 
-				EObject eObject = (EObject) allContents.next();
+				EObject eObject = allContents.next();
 
 				if (eObject instanceof Element) {
 					removeReferences(eObject, ancestorEObject);
@@ -1506,13 +1466,13 @@
 				}
 			}
 
-			for (Iterator allContents = getAllContents(ancestorEObject, true,
-				false); allContents.hasNext();) {
+			for (TreeIterator<EObject> allContents = getAllContents(
+				ancestorEObject, true, false); allContents.hasNext();) {
 
-				Object object = allContents.next();
+				EObject eObject = allContents.next();
 
-				if (object instanceof Element) {
-					((Element) object).eAdapters().clear();
+				if (eObject instanceof Element) {
+					eObject.eAdapters().clear();
 				}
 			}
 		}
@@ -1520,20 +1480,17 @@
 		EcoreUtil.remove(ancestorEObject);
 	}
 
-	protected static void destroyAll(Collection eObjects) {
+	protected static void destroyAll(Collection<EObject> eObjects) {
 
-		for (Iterator o = eObjects.iterator(); o.hasNext();) {
-			destroy((EObject) o.next());
+		for (Iterator<EObject> o = eObjects.iterator(); o.hasNext();) {
+			destroy(o.next());
 		}
 	}
 
-	protected static EList allOwnedElements(Element element,
-			EList allOwnedElements) {
+	protected static EList<Element> allOwnedElements(Element element,
+			EList<Element> allOwnedElements) {
 
-		for (Iterator ownedElements = element.getOwnedElements().iterator(); ownedElements
-			.hasNext();) {
-
-			Element ownedElement = (Element) ownedElements.next();
+		for (Element ownedElement : element.getOwnedElements()) {
 
 			if (allOwnedElements.add(ownedElement)) {
 				allOwnedElements(ownedElement, allOwnedElements);
@@ -1552,9 +1509,9 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allOwnedElements(Element element) {
+	public static EList<Element> allOwnedElements(Element element) {
 		return ECollections.unmodifiableEList(allOwnedElements(element,
-			new UniqueEList.FastCompare()));
+			new UniqueEList.FastCompare<Element>()));
 	}
 
 	/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExceptionHandlerOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExceptionHandlerOperations.java
index 3015ce5..b58de27 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExceptionHandlerOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExceptionHandlerOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExceptionHandlerOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ExceptionHandlerOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateExceptionBody(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 * @generated
 	 */
 	public static boolean validateResultPins(ExceptionHandler exceptionHandler,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -126,7 +126,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneInput(ExceptionHandler exceptionHandler,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -159,7 +159,7 @@
 	 */
 	public static boolean validateEdgeSourceTarget(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExecutionSpecificationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExecutionSpecificationOperations.java
index 5763d0a..9092879 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExecutionSpecificationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExecutionSpecificationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExecutionSpecificationOperations.java,v 1.5 2006/04/05 20:23:13 khussey Exp $
+ * $Id: ExecutionSpecificationOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -19,6 +19,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.uml2.uml.ExecutionSpecification;
+import org.eclipse.uml2.uml.Lifeline;
 import org.eclipse.uml2.uml.OccurrenceSpecification;
 import org.eclipse.uml2.uml.UMLPlugin;
 import org.eclipse.uml2.uml.util.UMLValidator;
@@ -60,15 +61,15 @@
 	 */
 	public static boolean validateSameLifeline(
 			ExecutionSpecification executionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		OccurrenceSpecification start = executionSpecification.getStart();
 
 		if (start != null) {
 			OccurrenceSpecification finish = executionSpecification.getFinish();
 
 			if (finish != null) {
-				EList startCovereds = start.getCovereds();
-				EList finishCovereds = finish.getCovereds();
+				EList<Lifeline> startCovereds = start.getCovereds();
+				EList<Lifeline> finishCovereds = finish.getCovereds();
 
 				if (!startCovereds.containsAll(finishCovereds)
 					|| !finishCovereds.containsAll(startCovereds)) {
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExpansionRegionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExpansionRegionOperations.java
index 0b45b45..5c81c3e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExpansionRegionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExpansionRegionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExpansionRegionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ExpansionRegionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateExpansionNodes(
 			ExpansionRegion expansionRegion, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtendOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtendOperations.java
index 8f8ee25..1f9ca3b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtendOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtendOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtendOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: ExtendOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateExtensionPoints(Extend extend,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionEndOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionEndOperations.java
index a96aed1..911cdf4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionEndOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionEndOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionEndOperations.java,v 1.12 2006/10/10 20:41:29 khussey Exp $
+ * $Id: ExtensionEndOperations.java,v 1.13 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 * @generated
 	 */
 	public static boolean validateMultiplicity(ExtensionEnd extensionEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 * @generated
 	 */
 	public static boolean validateAggregation(ExtensionEnd extensionEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionOperations.java
index c29008f..cba0ab6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionOperations.java,v 1.10 2006/02/02 19:23:40 khussey Exp $
+ * $Id: ExtensionOperations.java,v 1.11 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -21,7 +20,6 @@
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.uml2.uml.Extension;
-import org.eclipse.uml2.uml.ExtensionEnd;
 import org.eclipse.uml2.uml.Property;
 import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.Type;
@@ -72,7 +70,7 @@
 	 * @generated
 	 */
 	public static boolean validateNonOwnedEnd(Extension extension,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -104,7 +102,7 @@
 	 * @generated
 	 */
 	public static boolean validateIsBinary(Extension extension,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -132,14 +130,10 @@
 	 * @generated NOT
 	 */
 	public static Property getStereotypeEnd(Extension extension) {
-
-		for (Iterator ownedEnds = extension.getOwnedEnds().iterator(); ownedEnds
-			.hasNext();) {
-
-			return (Property) ownedEnds.next();
-		}
-
-		return null;
+		EList<Property> ownedEnds = extension.getOwnedEnds();
+		return ownedEnds.size() > 0
+			? ownedEnds.get(0)
+			: null;
 	}
 
 	/**
@@ -171,12 +165,9 @@
 	 * @generated NOT
 	 */
 	public static Property metaclassEnd(Extension extension) {
-		EList ownedEnds = extension.getOwnedEnds();
+		EList<Property> ownedEnds = extension.getOwnedEnds();
 
-		for (Iterator memberEnds = extension.getMemberEnds().iterator(); memberEnds
-			.hasNext();) {
-
-			Property memberEnd = (Property) memberEnds.next();
+		for (Property memberEnd : extension.getMemberEnds()) {
 
 			if (!ownedEnds.contains(memberEnd)) {
 				return memberEnd;
@@ -220,9 +211,8 @@
 	 * @generated NOT
 	 */
 	public static boolean isRequired(Extension extension) {
-		EList ownedEnds = extension.getOwnedEnds();
-		return ownedEnds.size() > 0
-			&& ((ExtensionEnd) ownedEnds.get(0)).lowerBound() == 1;
+		EList<Property> ownedEnds = extension.getOwnedEnds();
+		return ownedEnds.size() > 0 && ownedEnds.get(0).lowerBound() == 1;
 	}
 
 } // ExtensionOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionPointOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionPointOperations.java
index 655c09f..a5e8d71 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionPointOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ExtensionPointOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ExtensionPointOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ExtensionPointOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateMustHaveName(ExtensionPoint extensionPoint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalNodeOperations.java
index 37ce471..faba162 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalNodeOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: FinalNodeOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoOutgoingEdges(FinalNode finalNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalStateOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalStateOperations.java
index fb69d21..15b8a41 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalStateOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FinalStateOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FinalStateOperations.java,v 1.5 2006/02/23 17:20:47 khussey Exp $
+ * $Id: FinalStateOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoOutgoingTransitions(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoRegions(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -127,7 +127,8 @@
 	 * @generated
 	 */
 	public static boolean validateCannotReferenceSubmachine(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -159,7 +160,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoEntryBehavior(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -191,7 +192,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoExitBehavior(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -223,7 +224,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoStateBehavior(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ForkNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ForkNodeOperations.java
index 0436cc7..fc59166 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ForkNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ForkNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ForkNodeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ForkNodeOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneIncomingEdge(ForkNode forkNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateEdges(ForkNode forkNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FunctionBehaviorOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FunctionBehaviorOperations.java
index 89e1b61..14337b5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FunctionBehaviorOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/FunctionBehaviorOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: FunctionBehaviorOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: FunctionBehaviorOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateOneOutputParameter(
 			FunctionBehavior functionBehavior, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -99,7 +99,7 @@
 	 */
 	public static boolean validateTypesOfParameters(
 			FunctionBehavior functionBehavior, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GateOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GateOperations.java
index 295ca5c..1ed11e2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GateOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GateOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GateOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: GateOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateMessagesActualGate(Gate gate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateMessagesCombinedFragment(Gate gate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationOperations.java
index b8e28a7..c6d7779 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralizationOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: GeneralizationOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateGeneralizationSameClassifier(
 			Generalization generalization, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationSetOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationSetOperations.java
index 844e7b2..6128461 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationSetOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/GeneralizationSetOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: GeneralizationSetOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: GeneralizationSetOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateGeneralizationSameClassifier(
 			GeneralizationSet generalizationSet, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMapsToGeneralizationSet(
 			GeneralizationSet generalizationSet, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationFlowOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationFlowOperations.java
index 7aea88f..58c4bd3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationFlowOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationFlowOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationFlowOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: InformationFlowOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -70,7 +70,7 @@
 	 */
 	public static boolean validateSourcesAndTargetsKind(
 			InformationFlow informationFlow, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -102,7 +102,7 @@
 	 * @generated
 	 */
 	public static boolean validateMustConform(InformationFlow informationFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -137,7 +137,7 @@
 	 */
 	public static boolean validateConveyClassifiers(
 			InformationFlow informationFlow, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationItemOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationItemOperations.java
index d47c0c8..d4aaa2d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationItemOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InformationItemOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InformationItemOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: InformationItemOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -65,7 +65,7 @@
 	 */
 	public static boolean validateSourcesAndTargets(
 			InformationItem informationItem, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,7 +97,7 @@
 	 * @generated
 	 */
 	public static boolean validateHasNo(InformationItem informationItem,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -130,7 +130,7 @@
 	 */
 	public static boolean validateNotInstantiable(
 			InformationItem informationItem, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InitialNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InitialNodeOperations.java
index 6e7c50e..ab0fb31 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InitialNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InitialNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InitialNodeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: InitialNodeOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoIncomingEdges(InitialNode initialNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateControlEdges(InitialNode initialNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InputPinOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InputPinOperations.java
index 6613564..783f756 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InputPinOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InputPinOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InputPinOperations.java,v 1.1 2006/05/16 15:07:25 khussey Exp $
+ * $Id: InputPinOperations.java,v 1.2 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,8 @@
 	 * @generated
 	 */
 	public static boolean validateOutgoingEdgesStructuredOnly(
-			InputPin inputPin, DiagnosticChain diagnostics, Map context) {
+			InputPin inputPin, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InstanceSpecificationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InstanceSpecificationOperations.java
index 3756842..8ca96a2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InstanceSpecificationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InstanceSpecificationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InstanceSpecificationOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: InstanceSpecificationOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateDefiningFeature(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateStructuralFeature(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateDeploymentTarget(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -161,7 +161,7 @@
 	 */
 	public static boolean validateDeploymentArtifact(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionConstraintOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionConstraintOperations.java
index 242b5cd..72e20c1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionConstraintOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionConstraintOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionConstraintOperations.java,v 1.5 2006/01/05 22:43:26 khussey Exp $
+ * $Id: InteractionConstraintOperations.java,v 1.6 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -64,7 +64,7 @@
 	 */
 	public static boolean validateDynamicVariables(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,7 +97,7 @@
 	 */
 	public static boolean validateGlobalData(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -130,7 +130,7 @@
 	 */
 	public static boolean validateMinintMaxint(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -163,7 +163,7 @@
 	 */
 	public static boolean validateMinintNonNegative(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -196,7 +196,7 @@
 	 */
 	public static boolean validateMaxintPositive(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -229,7 +229,7 @@
 	 */
 	public static boolean validateMaxintGreaterEqualMinint(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionOperandOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionOperandOperations.java
index 5816829..599bd99 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionOperandOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionOperandOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionOperandOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: InteractionOperandOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateGuardDirectlyPrior(
 			InteractionOperand interactionOperand, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateGuardContainReferences(
 			InteractionOperand interactionOperand, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionUseOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionUseOperations.java
index 931662a..0ca37f6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionUseOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InteractionUseOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InteractionUseOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: InteractionUseOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 * @generated
 	 */
 	public static boolean validateGatesMatch(InteractionUse interactionUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 * @generated
 	 */
 	public static boolean validateAllLifelines(InteractionUse interactionUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -126,7 +126,7 @@
 	 */
 	public static boolean validateArgumentsCorrespondToParameters(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -159,7 +159,7 @@
 	 */
 	public static boolean validateArgumentsAreConstants(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterfaceOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterfaceOperations.java
index a3755c9..6cb5ce9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterfaceOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterfaceOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterfaceOperations.java,v 1.9 2006/04/05 19:26:35 khussey Exp $
+ * $Id: InterfaceOperations.java,v 1.10 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -68,12 +67,11 @@
 	 * @generated NOT
 	 */
 	public static boolean validateVisibility(Interface interface_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-		for (Iterator features = interface_.getFeatures().iterator(); features
-			.hasNext();) {
+		for (Feature feature : interface_.getFeatures()) {
 
-			if (((Feature) features.next()).getVisibility() != VisibilityKind.PUBLIC_LITERAL) {
+			if (feature.getVisibility() != VisibilityKind.PUBLIC_LITERAL) {
 
 				if (diagnostics != null) {
 					diagnostics.add(new BasicDiagnostic(Diagnostic.WARNING,
@@ -97,8 +95,8 @@
 	 * @generated NOT
 	 */
 	public static Operation createOwnedOperation(Interface interface_,
-			String name, EList parameterNames, EList parameterTypes,
-			Type returnType) {
+			String name, EList<String> parameterNames,
+			EList<Type> parameterTypes, Type returnType) {
 		return TypeOperations.createOwnedOperation(interface_, name,
 			parameterNames, parameterTypes, returnType);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterruptibleActivityRegionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterruptibleActivityRegionOperations.java
index bb64f1c..4ceaa9e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterruptibleActivityRegionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InterruptibleActivityRegionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InterruptibleActivityRegionOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: InterruptibleActivityRegionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateInterruptingEdges(
 			InterruptibleActivityRegion interruptibleActivityRegion,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InvocationActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InvocationActionOperations.java
index 31e4305..5deeed9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InvocationActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/InvocationActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: InvocationActionOperations.java,v 1.5 2006/01/05 22:43:25 khussey Exp $
+ * $Id: InvocationActionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateOnPortReceiver(
 			InvocationAction invocationAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/JoinNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/JoinNodeOperations.java
index 81983c6..cbd123c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/JoinNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/JoinNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: JoinNodeOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: JoinNodeOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneOutgoingEdge(JoinNode joinNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 * @generated
 	 */
 	public static boolean validateIncomingObjectFlow(JoinNode joinNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LifelineOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LifelineOperations.java
index 209cd95..5f27bce 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LifelineOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LifelineOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LifelineOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: LifelineOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,8 @@
 	 * @generated
 	 */
 	public static boolean validateInteractionUsesShareLifeline(
-			Lifeline lifeline, DiagnosticChain diagnostics, Map context) {
+			Lifeline lifeline, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +95,7 @@
 	 * @generated
 	 */
 	public static boolean validateSelectorSpecified(Lifeline lifeline,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +129,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameClassifier(Lifeline lifeline,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkActionOperations.java
index 8183432..e7c3157 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkActionOperations.java,v 1.5 2006/01/05 22:43:25 khussey Exp $
+ * $Id: LinkActionOperations.java,v 1.6 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -65,7 +65,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameAssociation(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,7 +97,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotStatic(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -134,7 +134,7 @@
 	 * @generated
 	 */
 	public static boolean validateSamePins(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -166,10 +166,10 @@
 	 * @generated NOT
 	 */
 	public static Association association(LinkAction linkAction) {
-		EList endData = linkAction.getEndData();
+		EList<LinkEndData> endData = linkAction.getEndData();
 
 		if (endData.size() > 0) {
-			Property end = ((LinkEndData) endData.get(0)).getEnd();
+			Property end = endData.get(0).getEnd();
 
 			if (end != null) {
 				return end.getAssociation();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndCreationDataOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndCreationDataOperations.java
index 498ff71..ebe9c81 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndCreationDataOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndCreationDataOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndCreationDataOperations.java,v 1.2 2006/01/05 22:43:26 khussey Exp $
+ * $Id: LinkEndCreationDataOperations.java,v 1.3 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateCreateLinkAction(
 			LinkEndCreationData linkEndCreationData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -101,7 +101,7 @@
 	 */
 	public static boolean validateSingleInputPin(
 			LinkEndCreationData linkEndCreationData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDataOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDataOperations.java
index 7a26d2f..b815954 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDataOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDataOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndDataOperations.java,v 1.2 2006/01/05 22:43:24 khussey Exp $
+ * $Id: LinkEndDataOperations.java,v 1.3 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,8 @@
 	 * @generated
 	 */
 	public static boolean validatePropertyIsAssociationEnd(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +95,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameType(LinkEndData linkEndData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -126,7 +127,7 @@
 	 * @generated
 	 */
 	public static boolean validateMultiplicity(LinkEndData linkEndData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -158,7 +159,7 @@
 	 * @generated
 	 */
 	public static boolean validateQualifiers(LinkEndData linkEndData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -190,7 +191,7 @@
 	 * @generated
 	 */
 	public static boolean validateEndObjectInputPin(LinkEndData linkEndData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDestructionDataOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDestructionDataOperations.java
index 0347fca..86173a1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDestructionDataOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LinkEndDestructionDataOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LinkEndDestructionDataOperations.java,v 1.2 2006/01/05 22:43:24 khussey Exp $
+ * $Id: LinkEndDestructionDataOperations.java,v 1.3 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateDestroyLinkAction(
 			LinkEndDestructionData linkEndDestructionData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateUnlimitedNaturalAndMultiplicity(
 			LinkEndDestructionData linkEndDestructionData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LoopNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LoopNodeOperations.java
index b2f2047..2fd5538 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LoopNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/LoopNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: LoopNodeOperations.java,v 1.5 2006/01/05 22:43:26 khussey Exp $
+ * $Id: LoopNodeOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateInputEdges(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateBodyOutputPins(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,7 @@
 	 * @generated
 	 */
 	public static boolean validateResultNoIncoming(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MergeNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MergeNodeOperations.java
index 0e2bca9..0dfee25 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MergeNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MergeNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MergeNodeOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: MergeNodeOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneOutgoingEdge(MergeNode mergeNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateEdges(MergeNode mergeNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MessageOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MessageOperations.java
index d3b9a3d..beca061 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MessageOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MessageOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MessageOperations.java,v 1.9 2006/04/05 20:58:07 khussey Exp $
+ * $Id: MessageOperations.java,v 1.10 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -92,7 +92,7 @@
 	 * @generated
 	 */
 	public static boolean validateSendingReceivingMessageEvent(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +124,7 @@
 	 * @generated
 	 */
 	public static boolean validateSignatureReferTo(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -156,22 +156,23 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSignatureIsOperation(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 		NamedElement signature = message.getSignature();
 
 		if (signature instanceof Operation) {
-			EList arguments = message.getArguments();
+			EList<ValueSpecification> arguments = message.getArguments();
 
 			if (!arguments.isEmpty()) {
-				EList parameters = new UniqueEList.FastCompare(
+				EList<Parameter> parameters = new UniqueEList.FastCompare<Parameter>(
 					((Operation) signature).getOwnedParameters());
 
 				if (message.getMessageSort() == MessageSort.REPLY_LITERAL) {
 
-					for (Iterator p = parameters.iterator(); p.hasNext();) {
+					for (Iterator<Parameter> p = parameters.iterator(); p
+						.hasNext();) {
 
-						if (((Parameter) p.next()).getDirection() == ParameterDirectionKind.IN_LITERAL) {
+						if (p.next().getDirection() == ParameterDirectionKind.IN_LITERAL) {
 							p.remove();
 						}
 					}
@@ -180,13 +181,12 @@
 				if (arguments.size() != parameters.size()) {
 					result = false;
 				} else {
-					Iterator a = arguments.iterator();
-					Iterator p = parameters.iterator();
+					Iterator<ValueSpecification> a = arguments.iterator();
+					Iterator<Parameter> p = parameters.iterator();
 
 					while (a.hasNext() && p.hasNext()) {
-						Type argumentType = ((ValueSpecification) a.next())
-							.getType();
-						Type parameterType = ((Parameter) p.next()).getType();
+						Type argumentType = a.next().getType();
+						Type parameterType = p.next().getType();
 
 						if (argumentType == null
 							? parameterType != null
@@ -223,26 +223,26 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSignatureIsSignal(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 		NamedElement signature = message.getSignature();
 
 		if (signature instanceof Signal) {
-			EList arguments = message.getArguments();
+			EList<ValueSpecification> arguments = message.getArguments();
 
 			if (!arguments.isEmpty()) {
-				EList attributes = ((Signal) signature).getAttributes();
+				EList<Property> attributes = ((Signal) signature)
+					.getAttributes();
 
 				if (arguments.size() != attributes.size()) {
 					result = false;
 				} else {
-					Iterator ma = arguments.iterator();
-					Iterator sa = attributes.iterator();
+					Iterator<ValueSpecification> ma = arguments.iterator();
+					Iterator<Property> sa = attributes.iterator();
 
 					while (ma.hasNext() && sa.hasNext()) {
-						Type argumentType = ((ValueSpecification) ma.next())
-							.getType();
-						Type attributeType = ((Property) sa.next()).getType();
+						Type argumentType = ma.next().getType();
+						Type attributeType = sa.next().getType();
 
 						if (argumentType == null
 							? attributeType != null
@@ -284,7 +284,7 @@
 	 * @generated
 	 */
 	public static boolean validateArguments(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -316,7 +316,7 @@
 	 * @generated
 	 */
 	public static boolean validateCannotCrossBoundaries(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -348,7 +348,7 @@
 	 * @generated
 	 */
 	public static boolean validateOccurrenceSpecifications(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -420,13 +420,15 @@
 		if (messageEvent == null) {
 			return null;
 		} else {
-			return (NamedElement) new UMLSwitch() {
+			return (NamedElement) new UMLSwitch<Object>() {
 
+				@Override
 				public Object caseCallEvent(CallEvent callEvent) {
 					return callEvent.eGet(
 						UMLPackage.Literals.CALL_EVENT__OPERATION, false);
 				}
 
+				@Override
 				public Object caseReceiveOperationEvent(
 						ReceiveOperationEvent receiveOperationEvent) {
 					return receiveOperationEvent.eGet(
@@ -434,6 +436,7 @@
 						false);
 				}
 
+				@Override
 				public Object caseReceiveSignalEvent(
 						ReceiveSignalEvent receiveSignalEvent) {
 					return receiveSignalEvent
@@ -441,6 +444,7 @@
 							false);
 				}
 
+				@Override
 				public Object caseSendOperationEvent(
 						SendOperationEvent sendOperationEvent) {
 					return sendOperationEvent.eGet(
@@ -448,12 +452,14 @@
 						false);
 				}
 
+				@Override
 				public Object caseSendSignalEvent(
 						SendSignalEvent sendSignalEvent) {
 					return sendSignalEvent.eGet(
 						UMLPackage.Literals.SEND_SIGNAL_EVENT__SIGNAL, false);
 				}
 
+				@Override
 				public Object caseSignalEvent(SignalEvent signalEvent) {
 					return signalEvent.eGet(
 						UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, false);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MultiplicityElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MultiplicityElementOperations.java
index d9aead5..8c31ff3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MultiplicityElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/MultiplicityElementOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: MultiplicityElementOperations.java,v 1.16 2006/10/10 20:41:29 khussey Exp $
+ * $Id: MultiplicityElementOperations.java,v 1.17 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -79,7 +79,7 @@
 	 */
 	public static boolean validateUpperGt0(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		int upperBound = multiplicityElement.upperBound();
@@ -114,7 +114,7 @@
 	 */
 	public static boolean validateLowerGe0(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		int lowerBound = multiplicityElement.lowerBound();
@@ -149,7 +149,7 @@
 	 */
 	public static boolean validateUpperGeLower(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		int upperBound = multiplicityElement.upperBound();
@@ -186,7 +186,7 @@
 	 */
 	public static boolean validateValueSpecificationNoSideEffects(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -219,7 +219,7 @@
 	 */
 	public static boolean validateValueSpecificationConstant(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
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 fa3b2e7..48afe4e 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
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NamedElementOperations.java,v 1.19 2006/11/08 20:26:30 khussey Exp $
+ * $Id: NamedElementOperations.java,v 1.20 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -79,7 +78,7 @@
 	 * @generated
 	 */
 	public static boolean validateHasNoQualifiedName(NamedElement namedElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -112,7 +111,7 @@
 	 * @generated
 	 */
 	public static boolean validateHasQualifiedName(NamedElement namedElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -144,7 +143,8 @@
 	 * @generated NOT
 	 */
 	public static boolean validateVisibilityNeedsOwnership(
-			NamedElement namedElement, DiagnosticChain diagnostics, Map context) {
+			NamedElement namedElement, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		boolean result = true;
 
 		if (namedElement.getNamespace() == null
@@ -237,8 +237,8 @@
 		return getQualifiedName(namedElement, namedElement.separator());
 	}
 
-	protected static EList allNamespaces(NamedElement namedElement,
-			EList allNamespaces) {
+	protected static EList<Namespace> allNamespaces(NamedElement namedElement,
+			EList<Namespace> allNamespaces) {
 		Namespace namespace = namedElement.getNamespace();
 
 		if (namespace != null && allNamespaces.add(namespace)) {
@@ -260,9 +260,9 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allNamespaces(NamedElement namedElement) {
+	public static EList<Namespace> allNamespaces(NamedElement namedElement) {
 		return ECollections.unmodifiableEList(allNamespaces(namedElement,
-			new UniqueEList.FastCompare()));
+			new UniqueEList.FastCompare<Namespace>()));
 	}
 
 	/**
@@ -283,12 +283,11 @@
 		EClass nEClass = n.eClass();
 
 		if (nEClass.isSuperTypeOf(eClass) || eClass.isSuperTypeOf(nEClass)) {
-			EList namesOfN = ns.getNamesOfMember(n);
+			EList<String> namesOfN = ns.getNamesOfMember(n);
 
-			for (Iterator namesOfMember = ns.getNamesOfMember(namedElement)
-				.iterator(); namesOfMember.hasNext();) {
+			for (String nameOfNamedElement : ns.getNamesOfMember(namedElement)) {
 
-				if (namesOfN.contains(namesOfMember.next())) {
+				if (namesOfN.contains(nameOfNamedElement)) {
 					return false;
 				}
 			}
@@ -319,13 +318,14 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allOwningPackages(NamedElement namedElement) {
-		EList allOwningPackages = new UniqueEList.FastCompare();
+	public static EList<org.eclipse.uml2.uml.Package> allOwningPackages(
+			NamedElement namedElement) {
+		EList<org.eclipse.uml2.uml.Package> allOwningPackages = new UniqueEList.FastCompare<org.eclipse.uml2.uml.Package>();
 
 		while ((namedElement = (NamedElement) getOwningElement(namedElement,
 			UMLPackage.Literals.PACKAGE, true)) != null) {
 
-			allOwningPackages.add(namedElement);
+			allOwningPackages.add((org.eclipse.uml2.uml.Package) namedElement);
 		}
 
 		return ECollections.unmodifiableEList(allOwningPackages);
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 6862cf2..656ff37 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
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NamespaceOperations.java,v 1.13 2006/04/24 22:15:46 khussey Exp $
+ * $Id: NamespaceOperations.java,v 1.14 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -82,7 +81,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateMembersDistinguishable(Namespace namespace,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (!namespace.membersAreDistinguishable()) {
@@ -155,14 +154,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getImportedElements(Namespace namespace) {
-		EList importedElements = new UniqueEList.FastCompare();
+	public static EList<PackageableElement> getImportedElements(
+			Namespace namespace) {
+		EList<PackageableElement> importedElements = new UniqueEList.FastCompare<PackageableElement>();
 
-		for (Iterator elementImports = namespace.getElementImports().iterator(); elementImports
-			.hasNext();) {
-
-			PackageableElement importedElement = ((ElementImport) elementImports
-				.next()).getImportedElement();
+		for (ElementImport elementImport : namespace.getElementImports()) {
+			PackageableElement importedElement = elementImport
+				.getImportedElement();
 
 			if (importedElement != null) {
 				importedElements.add(importedElement);
@@ -177,14 +175,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getImportedPackages(Namespace namespace) {
-		EList importedPackages = new UniqueEList.FastCompare();
+	public static EList<org.eclipse.uml2.uml.Package> getImportedPackages(
+			Namespace namespace) {
+		EList<org.eclipse.uml2.uml.Package> importedPackages = new UniqueEList.FastCompare<org.eclipse.uml2.uml.Package>();
 
-		for (Iterator packageImports = namespace.getPackageImports().iterator(); packageImports
-			.hasNext();) {
-
-			org.eclipse.uml2.uml.Package importedPackage = ((PackageImport) packageImports
-				.next()).getImportedPackage();
+		for (PackageImport packageImport : namespace.getPackageImports()) {
+			org.eclipse.uml2.uml.Package importedPackage = packageImport
+				.getImportedPackage();
 
 			if (importedPackage != null) {
 				importedPackages.add(importedPackage);
@@ -205,38 +202,37 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getImportedMembers(Namespace namespace) {
-		EList importedMembers = new UniqueEList.FastCompare();
+	public static EList<PackageableElement> getImportedMembers(
+			Namespace namespace) {
+		EList<PackageableElement> importedMembers = new UniqueEList.FastCompare<PackageableElement>();
 
-		for (Iterator elementImports = namespace.getElementImports().iterator(); elementImports
-			.hasNext();) {
-
-			PackageableElement importedElement = ((ElementImport) elementImports
-				.next()).getImportedElement();
+		for (ElementImport elementImport : namespace.getElementImports()) {
+			PackageableElement importedElement = elementImport
+				.getImportedElement();
 
 			if (importedElement != null) {
 				importedMembers.add(importedElement);
 			}
 		}
 
-		for (Iterator packageImports = namespace.getPackageImports().iterator(); packageImports
-			.hasNext();) {
-
-			org.eclipse.uml2.uml.Package importedPackage = ((PackageImport) packageImports
-				.next()).getImportedPackage();
+		for (PackageImport packageImport : namespace.getPackageImports()) {
+			org.eclipse.uml2.uml.Package importedPackage = packageImport
+				.getImportedPackage();
 
 			if (importedPackage != null) {
 				importedMembers.addAll(importedPackage.visibleMembers());
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) namespace,
+		return new UnionEObjectEList<PackageableElement>(
+			(InternalEObject) namespace,
 			UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER, importedMembers
 				.size(), importedMembers.toArray());
 	}
 
-	protected static EList getNamesOfMember(Namespace namespace,
-			NamedElement element, EList namespaces, EList namesOfMember) {
+	protected static EList<String> getNamesOfMember(Namespace namespace,
+			NamedElement element, EList<Namespace> namespaces,
+			EList<String> namesOfMember) {
 
 		if (!namespaces.contains(namespace)) {
 			namespaces.add(namespace);
@@ -248,13 +244,10 @@
 					namesOfMember.add(name);
 				}
 			} else {
-				EList elementImportNames = new UniqueEList();
+				EList<String> elementImportNames = new UniqueEList<String>();
 
-				for (Iterator elementImports = namespace.getElementImports()
-					.iterator(); elementImports.hasNext();) {
-
-					ElementImport elementImport = (ElementImport) elementImports
-						.next();
+				for (ElementImport elementImport : namespace
+					.getElementImports()) {
 
 					if (elementImport.getImportedElement() == element) {
 						String name = elementImport.getName();
@@ -267,12 +260,11 @@
 
 				if (elementImportNames.isEmpty()) {
 
-					for (Iterator packageImports = namespace
-						.getPackageImports().iterator(); packageImports
-						.hasNext();) {
+					for (PackageImport packageImport : namespace
+						.getPackageImports()) {
 
-						org.eclipse.uml2.uml.Package importedPackage = ((PackageImport) packageImports
-							.next()).getImportedPackage();
+						org.eclipse.uml2.uml.Package importedPackage = packageImport
+							.getImportedPackage();
 
 						if (importedPackage != null
 							&& importedPackage.visibleMembers().contains(
@@ -308,10 +300,11 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList getNamesOfMember(Namespace namespace,
+	public static EList<String> getNamesOfMember(Namespace namespace,
 			NamedElement element) {
 		return ECollections.unmodifiableEList(getNamesOfMember(namespace,
-			element, new UniqueEList.FastCompare(), new UniqueEList()));
+			element, new UniqueEList.FastCompare<Namespace>(),
+			new UniqueEList<String>()));
 	}
 
 	/**
@@ -326,15 +319,11 @@
 	 * @generated NOT
 	 */
 	public static boolean membersAreDistinguishable(Namespace namespace) {
-		EList namespaceMembers = namespace.getMembers();
+		EList<NamedElement> namespaceMembers = namespace.getMembers();
 
-		for (Iterator members = namespaceMembers.iterator(); members.hasNext();) {
-			NamedElement member = (NamedElement) members.next();
+		for (NamedElement member : namespaceMembers) {
 
-			for (Iterator otherMembers = namespaceMembers.iterator(); otherMembers
-				.hasNext();) {
-
-				NamedElement otherMember = (NamedElement) otherMembers.next();
+			for (NamedElement otherMember : namespaceMembers) {
 
 				if (member != otherMember
 					&& !member.isDistinguishableFrom(otherMember, namespace)) {
@@ -357,21 +346,18 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList importMembers(Namespace namespace, EList imps) {
-		EList importMembers = new UniqueEList.FastCompare();
+	public static EList<PackageableElement> importMembers(Namespace namespace,
+			EList<PackageableElement> imps) {
+		EList<PackageableElement> importMembers = new UniqueEList.FastCompare<PackageableElement>();
+		EList<NamedElement> ownedMembers = namespace.getOwnedMembers();
 
-		EList ownedMembers = namespace.getOwnedMembers();
+		excludeCollisionsLoop : for (PackageableElement excludeCollision : namespace
+			.excludeCollisions(imps)) {
 
-		excludeCollisionsLoop : for (Iterator excludeCollisions = namespace
-			.excludeCollisions(imps).iterator(); excludeCollisions.hasNext();) {
+			for (NamedElement ownedMember : ownedMembers) {
 
-			PackageableElement excludeCollision = (PackageableElement) excludeCollisions
-				.next();
-
-			for (Iterator om = ownedMembers.iterator(); om.hasNext();) {
-
-				if (!excludeCollision.isDistinguishableFrom(
-					(PackageableElement) om.next(), namespace)) {
+				if (!excludeCollision.isDistinguishableFrom(ownedMember,
+					namespace)) {
 
 					continue excludeCollisionsLoop;
 				}
@@ -392,14 +378,13 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList excludeCollisions(Namespace namespace, EList imps) {
-		EList excludeCollisions = new UniqueEList.FastCompare();
+	public static EList<PackageableElement> excludeCollisions(
+			Namespace namespace, EList<PackageableElement> imps) {
+		EList<PackageableElement> excludeCollisions = new UniqueEList.FastCompare<PackageableElement>();
 
-		imps1Loop : for (Iterator imps1 = imps.iterator(); imps1.hasNext();) {
-			PackageableElement imp1 = (PackageableElement) imps1.next();
+		imps1Loop : for (PackageableElement imp1 : imps) {
 
-			for (Iterator imps2 = imps.iterator(); imps2.hasNext();) {
-				PackageableElement imp2 = (PackageableElement) imps2.next();
+			for (PackageableElement imp2 : imps) {
 
 				if (imp1 != imp2
 					&& !imp1.isDistinguishableFrom(imp2, namespace)) {
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NodeOperations.java
index 98e21fb..7cd8550 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: NodeOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: NodeOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateInternalStructure(Node node,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectFlowOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectFlowOperations.java
index fcd7467..d231e18 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectFlowOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectFlowOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectFlowOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: ObjectFlowOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -65,7 +65,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoActions(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +98,7 @@
 	 * @generated
 	 */
 	public static boolean validateCompatibleTypes(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -130,7 +130,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameUpperBounds(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -162,7 +162,7 @@
 	 * @generated
 	 */
 	public static boolean validateTarget(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -194,7 +194,8 @@
 	 * @generated
 	 */
 	public static boolean validateTransformationBehaviour(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -226,7 +227,7 @@
 	 * @generated
 	 */
 	public static boolean validateSelectionBehaviour(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -258,7 +259,8 @@
 	 * @generated
 	 */
 	public static boolean validateInputAndOutputParameter(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -290,7 +292,8 @@
 	 * @generated
 	 */
 	public static boolean validateIsMulticastOrIsMultireceive(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectNodeOperations.java
index 60d15f2..9965fcf 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ObjectNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ObjectNodeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ObjectNodeOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 * @generated
 	 */
 	public static boolean validateObjectFlowEdges(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotUnique(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +125,7 @@
 	 * @generated
 	 */
 	public static boolean validateSelectionBehavior(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -157,7 +157,7 @@
 	 * @generated
 	 */
 	public static boolean validateInputOutputParameter(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OpaqueExpressionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OpaqueExpressionOperations.java
index 57c22cb..8c393be 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OpaqueExpressionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OpaqueExpressionOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OpaqueExpressionOperations.java,v 1.12 2006/04/05 13:50:03 khussey Exp $
+ * $Id: OpaqueExpressionOperations.java,v 1.13 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -73,7 +72,7 @@
 	 */
 	public static boolean validateLanguageBodySize(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -107,7 +106,7 @@
 	 */
 	public static boolean validateOnlyReturnResultParameters(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -141,7 +140,7 @@
 	 */
 	public static boolean validateOneReturnResultParameter(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -175,11 +174,10 @@
 	 */
 	public static int value(OpaqueExpression opaqueExpression) {
 
-		for (Iterator bodies = opaqueExpression.getBodies().iterator(); bodies
-			.hasNext();) {
+		for (String body : opaqueExpression.getBodies()) {
 
 			try {
-				return Integer.parseInt((String) bodies.next());
+				return Integer.parseInt(body);
 			} catch (NumberFormatException nfe) {
 				// ignore
 			}
@@ -199,11 +197,10 @@
 	 */
 	public static boolean isIntegral(OpaqueExpression opaqueExpression) {
 
-		for (Iterator bodies = opaqueExpression.getBodies().iterator(); bodies
-			.hasNext();) {
+		for (String body : opaqueExpression.getBodies()) {
 
 			try {
-				Integer.parseInt((String) bodies.next());
+				Integer.parseInt(body);
 				return true;
 			} catch (NumberFormatException nfe) {
 				// ignore
@@ -225,11 +222,10 @@
 	 */
 	public static boolean isPositive(OpaqueExpression opaqueExpression) {
 
-		for (Iterator bodies = opaqueExpression.getBodies().iterator(); bodies
-			.hasNext();) {
+		for (String body : opaqueExpression.getBodies()) {
 
 			try {
-				return Integer.parseInt((String) bodies.next()) > 0;
+				return Integer.parseInt(body) > 0;
 			} catch (NumberFormatException nfe) {
 				// ignore
 			}
@@ -250,11 +246,10 @@
 	 */
 	public static boolean isNonNegative(OpaqueExpression opaqueExpression) {
 
-		for (Iterator bodies = opaqueExpression.getBodies().iterator(); bodies
-			.hasNext();) {
+		for (String body : opaqueExpression.getBodies()) {
 
 			try {
-				return Integer.parseInt((String) bodies.next()) >= 0;
+				return Integer.parseInt(body) >= 0;
 			} catch (NumberFormatException nfe) {
 				// ignore
 			}
@@ -273,10 +268,7 @@
 
 		if (behavior != null) {
 
-			for (Iterator ownedParameters = behavior.getOwnedParameters()
-				.iterator(); ownedParameters.hasNext();) {
-
-				Parameter ownedParameter = (Parameter) ownedParameters.next();
+			for (Parameter ownedParameter : behavior.getOwnedParameters()) {
 
 				if (ownedParameter.getDirection() == ParameterDirectionKind.RETURN_LITERAL) {
 					return ownedParameter;
@@ -293,10 +285,10 @@
 	 * @generated NOT
 	 */
 	public static String stringValue(OpaqueExpression opaqueExpression) {
-		EList bodies = opaqueExpression.getBodies();
+		EList<String> bodies = opaqueExpression.getBodies();
 
 		return bodies.size() > 0
-			? (String) bodies.get(0)
+			? bodies.get(0)
 			: ValueSpecificationOperations.stringValue(opaqueExpression);
 	}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OperationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OperationOperations.java
index 7c9583a..3a4ace4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OperationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OperationOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OperationOperations.java,v 1.12 2006/10/10 20:41:28 khussey Exp $
+ * $Id: OperationOperations.java,v 1.13 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -84,7 +83,7 @@
 	 * @generated
 	 */
 	public static boolean validateAtMostOneReturn(Operation operation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -116,7 +115,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateOnlyBodyForQuery(Operation operation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (operation.getBodyCondition() != null && !operation.isQuery()) {
@@ -235,13 +234,10 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList returnResult(Operation operation) {
-		EList returnResult = new UniqueEList.FastCompare();
+	public static EList<Parameter> returnResult(Operation operation) {
+		EList<Parameter> returnResult = new UniqueEList.FastCompare<Parameter>();
 
-		for (Iterator ownedParameters = operation.getOwnedParameters()
-			.iterator(); ownedParameters.hasNext();) {
-
-			Parameter ownedParameter = (Parameter) ownedParameters.next();
+		for (Parameter ownedParameter : operation.getOwnedParameters()) {
 
 			if (ownedParameter.getDirection() == ParameterDirectionKind.RETURN_LITERAL) {
 				returnResult.add(ownedParameter);
@@ -340,10 +336,7 @@
 	 */
 	public static Parameter getReturnResult(Operation operation) {
 
-		for (Iterator ownedParameters = operation.getOwnedParameters()
-			.iterator(); ownedParameters.hasNext();) {
-
-			Parameter ownedParameter = (Parameter) ownedParameters.next();
+		for (Parameter ownedParameter : operation.getOwnedParameters()) {
 
 			if (ownedParameter.getDirection() == ParameterDirectionKind.RETURN_LITERAL) {
 				return ownedParameter;
@@ -392,22 +385,21 @@
 
 			Operation op = (Operation) redefinee;
 
-			EList ownedParameters = operation.getOwnedParameters();
+			EList<Parameter> ownedParameters = operation.getOwnedParameters();
 			int ownedParametersSize = ownedParameters.size();
-			EList opOwnedParameters = op.getOwnedParameters();
+			EList<Parameter> opOwnedParameters = op.getOwnedParameters();
 
-			EList returnResult = operation.returnResult();
+			EList<Parameter> returnResult = operation.returnResult();
 			int returnResultSize = returnResult.size();
-			EList opReturnResult = op.returnResult();
+			EList<Parameter> opReturnResult = op.returnResult();
 
 			if (ownedParametersSize == opOwnedParameters.size()
 				&& returnResultSize == opReturnResult.size()) {
 
 				for (int i = 0; i < ownedParametersSize; i++) {
-					Type opOwnedParameterType = ((Parameter) opOwnedParameters
-						.get(i)).getType();
-					Type ownedParameterType = ((Parameter) ownedParameters
-						.get(i)).getType();
+					Type opOwnedParameterType = opOwnedParameters.get(i)
+						.getType();
+					Type ownedParameterType = ownedParameters.get(i).getType();
 
 					if (opOwnedParameterType == null
 						? ownedParameterType != null
@@ -418,10 +410,8 @@
 				}
 
 				for (int i = 0; i < returnResultSize; i++) {
-					Type opReturnResultType = ((Parameter) opReturnResult
-						.get(i)).getType();
-					Type returnResultType = ((Parameter) returnResult.get(i))
-						.getType();
+					Type opReturnResultType = opReturnResult.get(i).getType();
+					Type returnResultType = returnResult.get(i).getType();
 
 					if (opReturnResultType == null
 						? returnResultType != null
@@ -438,4 +428,4 @@
 		return false;
 	}
 
-} // OperationOperations
\ No newline at end of file
+} // OperationOperations
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OutputPinOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OutputPinOperations.java
index cfe1b45..8126d42 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OutputPinOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/OutputPinOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: OutputPinOperations.java,v 1.1 2006/05/16 15:07:25 khussey Exp $
+ * $Id: OutputPinOperations.java,v 1.2 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,8 @@
 	 * @generated
 	 */
 	public static boolean validateIncomingEdgesStructuredOnly(
-			OutputPin outputPin, DiagnosticChain diagnostics, Map context) {
+			OutputPin outputPin, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageImportOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageImportOperations.java
index f0b0c4a..15f2c10 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageImportOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageImportOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageImportOperations.java,v 1.5 2006/03/13 20:50:41 khussey Exp $
+ * $Id: PackageImportOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validatePublicOrPrivate(PackageImport packageImport,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		VisibilityKind visibility = packageImport.getVisibility();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageOperations.java
index bd137bb..962a770 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PackageOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PackageOperations.java,v 1.28 2006/10/10 20:41:29 khussey Exp $
+ * $Id: PackageOperations.java,v 1.29 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -20,6 +20,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.UniqueEList;
 
 import org.eclipse.emf.ecore.EAttribute;
@@ -49,6 +50,7 @@
 import org.eclipse.uml2.uml.Profile;
 import org.eclipse.uml2.uml.ProfileApplication;
 import org.eclipse.uml2.uml.Stereotype;
+import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.UMLPlugin;
 import org.eclipse.uml2.uml.PackageImport;
@@ -95,6 +97,8 @@
 	protected static class StereotypeApplicationCopier
 			extends EcoreUtil.Copier {
 
+		private static final long serialVersionUID = 1L;
+
 		protected final Profile profile;
 
 		protected StereotypeApplicationCopier(Profile profile) {
@@ -103,6 +107,7 @@
 			this.profile = profile;
 		}
 
+		@Override
 		protected EObject createCopy(EObject eObject) {
 			Element baseElement = getBaseElement(eObject);
 			return baseElement == null
@@ -110,16 +115,19 @@
 				: applyStereotype(baseElement, getTarget(eObject.eClass()));
 		}
 
+		@Override
 		protected EClass getTarget(EClass eClass) {
 			return (EClass) profile.getDefinition(getNamedElement(eClass));
 		}
 
+		@Override
 		protected EStructuralFeature getTarget(
 				EStructuralFeature eStructuralFeature) {
 			return (EStructuralFeature) profile
 				.getDefinition(getNamedElement(eStructuralFeature));
 		}
 
+		@Override
 		protected void copyAttribute(EAttribute eAttribute, EObject eObject,
 				EObject copyEObject) {
 
@@ -148,10 +156,12 @@
 				.getEFactoryInstance();
 
 			if (targetEAttribute.isMany()) {
-				EList copyValues = (EList) copyEObject.eGet(targetEAttribute);
+				@SuppressWarnings("unchecked")
+				EList<Object> copyValues = (EList<Object>) copyEObject
+					.eGet(targetEAttribute);
 
 				if (eAttribute.isMany()) {
-					EList values = (EList) eObject.eGet(eAttribute);
+					EList<?> values = (EList<?>) eObject.eGet(eAttribute);
 
 					for (int i = 0, size = values.size(); i < size; i++) {
 						copyValues.add(i, targetEFactory.createFromString(
@@ -167,7 +177,7 @@
 				copyEObject.eSet(targetEAttribute, targetEFactory
 					.createFromString(targetEDataType, eFactory
 						.convertToString(eDataType, eAttribute.isMany()
-							? ((EList) eObject.eGet(eAttribute)).get(0)
+							? ((EList<?>) eObject.eGet(eAttribute)).get(0)
 							: eObject.eGet(eAttribute))));
 			}
 		}
@@ -178,29 +188,33 @@
 			EEnum targetEEnum = (EEnum) targetEAttribute.getEAttributeType();
 
 			if (targetEAttribute.isMany()) {
-				EList copyValues = (EList) copyEObject.eGet(targetEAttribute);
+				@SuppressWarnings("unchecked")
+				EList<EEnumLiteral> copyValues = (EList<EEnumLiteral>) copyEObject
+					.eGet(targetEAttribute);
 
 				if (eAttribute.isMany()) {
-					EList values = (EList) eObject.eGet(eAttribute);
+					@SuppressWarnings("unchecked")
+					EList<EEnumLiteral> values = (EList<EEnumLiteral>) eObject
+						.eGet(eAttribute);
 
 					for (int i = 0, size = values.size(); i < size; i++) {
-						copyValues.add(i, targetEEnum.getEEnumLiteral(
-							((EEnumLiteral) values.get(i)).getName())
-							.getInstance());
+						copyValues.add(i, targetEEnum.getEEnumLiteral(values
+							.get(i).getName()));
 					}
 				} else {
-					copyValues.add(targetEEnum.getEEnumLiteral(
-						((EEnumLiteral) eObject.eGet(eAttribute)).getName())
-						.getInstance());
+					copyValues.add(targetEEnum
+						.getEEnumLiteral(((EEnumLiteral) eObject
+							.eGet(eAttribute)).getName()));
 				}
 			} else {
 				copyEObject.eSet(targetEAttribute, targetEEnum.getEEnumLiteral(
 					((EEnumLiteral) (eAttribute.isMany()
-						? ((EList) eObject.eGet(eAttribute)).get(0)
+						? ((EList<?>) eObject.eGet(eAttribute)).get(0)
 						: eObject.eGet(eAttribute))).getName()).getInstance());
 			}
 		}
 
+		@Override
 		protected void copyContainment(EReference eReference, EObject eObject,
 				EObject copyEObject) {
 
@@ -211,11 +225,14 @@
 					EReference targetEReference = (EReference) getTarget(eReference);
 
 					if (targetEReference.isMany()) {
-						EList copyValues = (EList) copyEObject
+						@SuppressWarnings("unchecked")
+						EList<EObject> copyValues = (EList<EObject>) copyEObject
 							.eGet(targetEReference);
 
 						if (eReference.isMany()) {
-							copyValues.addAll(copyAll((EList) value));
+							@SuppressWarnings("unchecked")
+							EList<EObject> values = (EList<EObject>) value;
+							copyValues.addAll(copyAll(values));
 						} else if (value != null) {
 							copyValues.add(copy((EObject) value));
 						}
@@ -231,6 +248,7 @@
 			}
 		}
 
+		@Override
 		protected void copyReference(EReference eReference, EObject eObject,
 				EObject copyEObject) {
 
@@ -241,7 +259,8 @@
 					EReference targetEReference = (EReference) getTarget(eReference);
 
 					if (targetEReference.isMany()) {
-						InternalEList copyValues = (InternalEList) copyEObject
+						@SuppressWarnings("unchecked")
+						InternalEList<EObject> copyValues = (InternalEList<EObject>) copyEObject
 							.eGet(targetEReference);
 
 						if (eReference.isMany()) {
@@ -249,16 +268,19 @@
 								.getEOpposite();
 							int index = 0;
 
-							for (Iterator v = ((EList) value).iterator(); v
-								.hasNext();) {
+							@SuppressWarnings("unchecked")
+							Iterator<EObject> v = ((EList<EObject>) value)
+								.iterator();
 
+							while (v.hasNext()) {
 								value = v.next();
-								Object copyValue = get(value);
+								EObject copyValue = get(value);
 
 								if (copyValue == null) {
 
 									if (targetEOpposite == null) {
-										copyValues.addUnique(index++, value);
+										copyValues.addUnique(index++,
+											(EObject) value);
 									}
 								} else {
 
@@ -279,12 +301,12 @@
 								}
 							}
 						} else if (value != null) {
-							Object copyValue = get(value);
+							EObject copyValue = get(value);
 
 							if (copyValue == null) {
 
 								if (targetEReference.getEOpposite() == null) {
-									copyValues.addUnique(value);
+									copyValues.addUnique((EObject) value);
 								}
 							} else {
 								copyValues.addUnique(copyValue);
@@ -293,7 +315,9 @@
 					} else {
 
 						if (eReference.isMany()) {
-							value = ((EList) value).get(0);
+							@SuppressWarnings("unchecked")
+							EList<EObject> values = (EList<EObject>) value;
+							value = values.get(0);
 						}
 
 						Object copyValue = get(value);
@@ -334,13 +358,10 @@
 	 */
 	public static boolean validateElementsPublicOrPrivate(
 			org.eclipse.uml2.uml.Package package_, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = true;
 
-		for (Iterator ownedElements = package_.getOwnedElements().iterator(); ownedElements
-			.hasNext();) {
-
-			Element ownedElement = (Element) ownedElements.next();
+		for (Element ownedElement : package_.getOwnedElements()) {
 
 			if (ownedElement instanceof NamedElement) {
 				VisibilityKind visibility = ((NamedElement) ownedElement)
@@ -425,8 +446,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList applyProfile(org.eclipse.uml2.uml.Package package_,
-			Profile profile) {
+	public static EList<EObject> applyProfile(
+			org.eclipse.uml2.uml.Package package_, Profile profile) {
 
 		if (profile == null) {
 			throw new IllegalArgumentException(String.valueOf(profile));
@@ -442,29 +463,25 @@
 			package_.createProfileApplication().setAppliedProfile(profile);
 		}
 
-		EList stereotypeApplications = new UniqueEList.FastCompare();
+		EList<EObject> stereotypeApplications = new UniqueEList.FastCompare<EObject>();
 		StereotypeApplicationCopier copier = new StereotypeApplicationCopier(
 			profile);
 
-		for (Iterator allContents = getAllContents(package_, true, false); allContents
-			.hasNext();) {
+		for (TreeIterator<EObject> allContents = getAllContents(package_, true,
+			false); allContents.hasNext();) {
 
-			Object object = allContents.next();
+			EObject eObject = allContents.next();
 
-			if (object instanceof Element) {
-				Element element = (Element) object;
+			if (eObject instanceof Element) {
+				Element element = (Element) eObject;
 
 				if (element instanceof org.eclipse.uml2.uml.Package) {
 
-					for (Iterator profileApplications = ((org.eclipse.uml2.uml.Package) element)
-						.getProfileApplications().iterator(); profileApplications
-						.hasNext();) {
-
-						ProfileApplication profileApplication = (ProfileApplication) profileApplications
-							.next();
+					for (ProfileApplication profileApplication : ((org.eclipse.uml2.uml.Package) element)
+						.getProfileApplications()) {
 
 						if (profileApplication.getAppliedProfile() == profile) {
-							EList references = getEAnnotation(
+							EList<EObject> references = getEAnnotation(
 								profileApplication, UMLPackage.eNS_URI, true)
 								.getReferences();
 
@@ -477,10 +494,8 @@
 					}
 				}
 
-				for (Iterator sa = element.getStereotypeApplications()
-					.iterator(); sa.hasNext();) {
-
-					EObject stereotypeApplication = (EObject) sa.next();
+				for (EObject stereotypeApplication : element
+					.getStereotypeApplications()) {
 					Stereotype stereotype = getStereotype(stereotypeApplication);
 
 					if (stereotype != null
@@ -492,7 +507,8 @@
 								.eResource();
 
 							if (eResource != null) {
-								EList contents = eResource.getContents();
+								EList<EObject> contents = eResource
+									.getContents();
 
 								if (eResource == copy.eResource()) {
 									contents.move(contents
@@ -514,10 +530,8 @@
 
 		destroyAll(stereotypeApplications);
 
-		EList requiredExtensions = profile.getOwnedExtensions(true);
-
-		return requiredExtensions.isEmpty()
-			? ECollections.EMPTY_ELIST
+		return profile.getOwnedExtensions(true).isEmpty()
+			? ECollections.<EObject> emptyEList()
 			: applyAllRequiredStereotypes(package_);
 	}
 
@@ -526,27 +540,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList unapplyProfile(org.eclipse.uml2.uml.Package package_,
-			Profile profile) {
+	public static EList<EObject> unapplyProfile(
+			org.eclipse.uml2.uml.Package package_, Profile profile) {
 
 		if (profile == null || package_.getProfileApplication(profile) == null) {
 			throw new IllegalArgumentException(String.valueOf(profile));
 		}
 
-		EList profileApplications = new UniqueEList.FastCompare();
+		EList<ProfileApplication> profileApplications = new UniqueEList.FastCompare<ProfileApplication>();
 
-		for (Iterator allContents = getAllContents(package_, true, false); allContents
-			.hasNext();) {
+		for (TreeIterator<EObject> allContents = getAllContents(package_, true,
+			false); allContents.hasNext();) {
 
-			Object object = allContents.next();
+			EObject eObject = allContents.next();
 
-			if (object instanceof org.eclipse.uml2.uml.Package) {
+			if (eObject instanceof org.eclipse.uml2.uml.Package) {
 
-				for (Iterator pa = ((org.eclipse.uml2.uml.Package) object)
-					.getProfileApplications().iterator(); pa.hasNext();) {
-
-					ProfileApplication profileApplication = (ProfileApplication) pa
-						.next();
+				for (ProfileApplication profileApplication : ((org.eclipse.uml2.uml.Package) eObject)
+					.getProfileApplications()) {
 
 					if (profileApplication.getAppliedProfile() == profile) {
 						profileApplications.add(profileApplication);
@@ -558,18 +569,17 @@
 		destroyAll(profileApplications);
 
 		return package_.getAllAppliedProfiles().contains(profile)
-			? ECollections.EMPTY_ELIST
+			? ECollections.<EObject> emptyEList()
 			: unapplyAllNonApplicableStereotypes(package_);
 	}
 
-	protected static EList getAppliedProfiles(
-			org.eclipse.uml2.uml.Package package_, EList appliedProfiles) {
+	protected static EList<Profile> getAppliedProfiles(
+			org.eclipse.uml2.uml.Package package_,
+			EList<Profile> appliedProfiles) {
 
-		for (Iterator profileApplications = package_.getProfileApplications()
-			.iterator(); profileApplications.hasNext();) {
-
-			Profile appliedProfile = ((ProfileApplication) profileApplications
-				.next()).getAppliedProfile();
+		for (ProfileApplication profileApplication : package_
+			.getProfileApplications()) {
+			Profile appliedProfile = profileApplication.getAppliedProfile();
 
 			if (appliedProfile != null) {
 				appliedProfiles.add(appliedProfile);
@@ -584,8 +594,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAppliedProfiles(org.eclipse.uml2.uml.Package package_) {
-		return getAppliedProfiles(package_, new UniqueEList.FastCompare());
+	public static EList<Profile> getAppliedProfiles(
+			org.eclipse.uml2.uml.Package package_) {
+		return getAppliedProfiles(package_,
+			new UniqueEList.FastCompare<Profile>());
 	}
 
 	/**
@@ -596,11 +608,10 @@
 	public static Profile getAppliedProfile(
 			org.eclipse.uml2.uml.Package package_, String qualifiedName) {
 
-		for (Iterator profileApplications = package_.getProfileApplications()
-			.iterator(); profileApplications.hasNext();) {
+		for (ProfileApplication profileApplication : package_
+			.getProfileApplications()) {
 
-			Profile appliedProfile = ((ProfileApplication) profileApplications
-				.next()).getAppliedProfile();
+			Profile appliedProfile = profileApplication.getAppliedProfile();
 
 			if (appliedProfile != null
 				&& safeEquals(appliedProfile.getQualifiedName(), qualifiedName)) {
@@ -642,17 +653,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllProfileApplications(
+	public static EList<ProfileApplication> getAllProfileApplications(
 			org.eclipse.uml2.uml.Package package_) {
-		EList allProfileApplications = new UniqueEList.FastCompare(package_
-			.getProfileApplications());
+		EList<ProfileApplication> allProfileApplications = new UniqueEList.FastCompare<ProfileApplication>(
+			package_.getProfileApplications());
 
-		for (Iterator allOwningPackages = package_.allOwningPackages()
-			.iterator(); allOwningPackages.hasNext();) {
+		for (org.eclipse.uml2.uml.Package owningPackage : package_
+			.allOwningPackages()) {
 
-			allProfileApplications
-				.addAll(((org.eclipse.uml2.uml.Package) allOwningPackages
-					.next()).getProfileApplications());
+			allProfileApplications.addAll(owningPackage
+				.getProfileApplications());
 		}
 
 		return ECollections.unmodifiableEList(allProfileApplications);
@@ -666,11 +676,8 @@
 	public static ProfileApplication getProfileApplication(
 			org.eclipse.uml2.uml.Package package_, Profile profile) {
 
-		for (Iterator profileApplications = package_.getProfileApplications()
-			.iterator(); profileApplications.hasNext();) {
-
-			ProfileApplication profileApplication = (ProfileApplication) profileApplications
-				.next();
+		for (ProfileApplication profileApplication : package_
+			.getProfileApplications()) {
 
 			if (profileApplication.getAppliedProfile() == profile) {
 				return profileApplication;
@@ -732,28 +739,25 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllAppliedProfiles(
+	public static EList<Profile> getAllAppliedProfiles(
 			org.eclipse.uml2.uml.Package package_) {
-		EList allAppliedProfiles = getAppliedProfiles(package_,
-			new UniqueEList.FastCompare());
+		EList<Profile> allAppliedProfiles = getAppliedProfiles(package_,
+			new UniqueEList.FastCompare<Profile>());
 
-		for (Iterator allOwningPackages = package_.allOwningPackages()
-			.iterator(); allOwningPackages.hasNext();) {
+		for (org.eclipse.uml2.uml.Package owningPackage : package_
+			.allOwningPackages()) {
 
-			getAppliedProfiles((org.eclipse.uml2.uml.Package) allOwningPackages
-				.next(), allAppliedProfiles);
+			getAppliedProfiles(owningPackage, allAppliedProfiles);
 		}
 
 		return ECollections.unmodifiableEList(allAppliedProfiles);
 	}
 
-	protected static EList getAllImportedPackages(
-			org.eclipse.uml2.uml.Package package_, EList allImportedPackages) {
+	protected static EList<org.eclipse.uml2.uml.Package> getAllImportedPackages(
+			org.eclipse.uml2.uml.Package package_,
+			EList<org.eclipse.uml2.uml.Package> allImportedPackages) {
 
-		for (Iterator packageImports = package_.getPackageImports().iterator(); packageImports
-			.hasNext();) {
-
-			PackageImport packageImport = (PackageImport) packageImports.next();
+		for (PackageImport packageImport : package_.getPackageImports()) {
 
 			if (packageImport.getVisibility() == VisibilityKind.PUBLIC_LITERAL) {
 				org.eclipse.uml2.uml.Package importedPackage = packageImport
@@ -770,24 +774,20 @@
 		return allImportedPackages;
 	}
 
-	protected static EList visibleMembers(
-			org.eclipse.uml2.uml.Package package_, EList visibleMembers) {
+	protected static EList<PackageableElement> visibleMembers(
+			org.eclipse.uml2.uml.Package package_,
+			EList<PackageableElement> visibleMembers) {
 
-		for (Iterator ownedMembers = package_.getOwnedMembers().iterator(); ownedMembers
-			.hasNext();) {
+		for (NamedElement ownedMember : package_.getOwnedMembers()) {
 
-			PackageableElement ownedMember = (PackageableElement) ownedMembers
-				.next();
+			if (ownedMember instanceof PackageableElement
+				&& ownedMember.getVisibility() == VisibilityKind.PUBLIC_LITERAL) {
 
-			if (ownedMember.getVisibility() == VisibilityKind.PUBLIC_LITERAL) {
-				visibleMembers.add(ownedMember);
+				visibleMembers.add((PackageableElement) ownedMember);
 			}
 		}
 
-		for (Iterator elementImports = package_.getElementImports().iterator(); elementImports
-			.hasNext();) {
-
-			ElementImport elementImport = (ElementImport) elementImports.next();
+		for (ElementImport elementImport : package_.getElementImports()) {
 
 			if (elementImport.getVisibility() == VisibilityKind.PUBLIC_LITERAL) {
 				PackageableElement importedElement = elementImport
@@ -812,16 +812,16 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList visibleMembers(org.eclipse.uml2.uml.Package package_) {
-		EList visibleMembers = visibleMembers(package_,
-			new UniqueEList.FastCompare());
+	public static EList<PackageableElement> visibleMembers(
+			org.eclipse.uml2.uml.Package package_) {
+		EList<PackageableElement> visibleMembers = visibleMembers(package_,
+			new UniqueEList.FastCompare<PackageableElement>());
 
-		for (Iterator allImportedPackages = getAllImportedPackages(package_,
-			new UniqueEList.FastCompare()).iterator(); allImportedPackages
-			.hasNext();) {
+		for (org.eclipse.uml2.uml.Package importedPackage : getAllImportedPackages(
+			package_,
+			new UniqueEList.FastCompare<org.eclipse.uml2.uml.Package>())) {
 
-			visibleMembers((org.eclipse.uml2.uml.Package) allImportedPackages
-				.next(), visibleMembers);
+			visibleMembers(importedPackage, visibleMembers);
 		}
 
 		return ECollections.unmodifiableEList(visibleMembers);
@@ -846,20 +846,14 @@
 			return el.getVisibility() == VisibilityKind.PUBLIC_LITERAL;
 		}
 
-		for (Iterator elementImports = package_.getElementImports().iterator(); elementImports
-			.hasNext();) {
-
-			ElementImport elementImport = (ElementImport) elementImports.next();
+		for (ElementImport elementImport : package_.getElementImports()) {
 
 			if (safeEquals(elementImport.getImportedElement(), el)) {
 				return elementImport.getVisibility() == VisibilityKind.PUBLIC_LITERAL;
 			}
 		}
 
-		for (Iterator packageImports = package_.getPackageImports().iterator(); packageImports
-			.hasNext();) {
-
-			PackageImport packageImport = (PackageImport) packageImports.next();
+		for (PackageImport packageImport : package_.getPackageImports()) {
 
 			if (packageImport.getVisibility() == VisibilityKind.PUBLIC_LITERAL) {
 				org.eclipse.uml2.uml.Package importedPackage = packageImport
@@ -889,10 +883,7 @@
 	protected static boolean containsSpecializations(
 			org.eclipse.uml2.uml.Package package_, Classifier classifier) {
 
-		for (Iterator ownedTypes = package_.getOwnedTypes().iterator(); ownedTypes
-			.hasNext();) {
-
-			Object ownedType = ownedTypes.next();
+		for (Type ownedType : package_.getOwnedTypes()) {
 
 			if (ownedType instanceof Classifier
 				&& ((Classifier) ownedType).allParents().contains(classifier)) {
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterOperations.java
index 7ec71ce..7d582ba 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterOperations.java,v 1.17 2006/05/02 21:51:04 khussey Exp $
+ * $Id: ParameterOperations.java,v 1.18 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -79,7 +79,7 @@
 	 * @generated
 	 */
 	public static boolean validateConnectorEnd(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -111,7 +111,7 @@
 	 * @generated
 	 */
 	public static boolean validateStreamAndException(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -143,7 +143,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotException(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -175,7 +175,7 @@
 	 * @generated
 	 */
 	public static boolean validateReentrantBehaviors(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -207,7 +207,7 @@
 	 * @generated
 	 */
 	public static boolean validateInAndOut(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterSetOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterSetOperations.java
index c011c00..10bbf3b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterSetOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ParameterSetOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ParameterSetOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ParameterSetOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,8 @@
 	 * @generated
 	 */
 	public static boolean validateSameParameterizedEntity(
-			ParameterSet parameterSet, DiagnosticChain diagnostics, Map context) {
+			ParameterSet parameterSet, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +93,7 @@
 	 * @generated
 	 */
 	public static boolean validateInput(ParameterSet parameterSet,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +125,7 @@
 	 * @generated
 	 */
 	public static boolean validateTwoParameterSets(ParameterSet parameterSet,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PartDecompositionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PartDecompositionOperations.java
index bde5ed9..19f8da4 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PartDecompositionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PartDecompositionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PartDecompositionOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: PartDecompositionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validatePartsOfInternalStructures(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +98,7 @@
 	 * @generated
 	 */
 	public static boolean validateAssume(PartDecomposition partDecomposition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -133,7 +133,7 @@
 	 */
 	public static boolean validateCommutativityOfDecomposition(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PinOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PinOperations.java
index fdace47..a80c55f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PinOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PinOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PinOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: PinOperations.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateControlPins(Pin pin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PortOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PortOperations.java
index b3d6a46..d7ff0cd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PortOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PortOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PortOperations.java,v 1.12 2006/10/11 16:30:15 khussey Exp $
+ * $Id: PortOperations.java,v 1.13 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -76,7 +75,7 @@
 	 * @generated
 	 */
 	public static boolean validateRequiredInterfaces(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -108,7 +107,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validatePortAggregation(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (port.getAggregation() != AggregationKind.COMPOSITE_LITERAL) {
 
@@ -137,7 +136,7 @@
 	 * @generated
 	 */
 	public static boolean validatePortDestroyed(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -169,7 +168,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateDefaultValue(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (port.getType() instanceof Interface
 			&& port.getDefaultValue() != null) {
@@ -194,28 +193,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getProvideds(Port port) {
-		EList provideds = new UniqueEList.FastCompare();
-
+	public static EList<Interface> getProvideds(Port port) {
+		EList<Interface> provideds = new UniqueEList.FastCompare<Interface>();
 		Type type = (Type) port.eGet(UMLPackage.Literals.TYPED_ELEMENT__TYPE,
 			false);
 
 		if (type instanceof Interface) {
-			provideds.add(type);
+			provideds.add((Interface) type);
 		} else if (type instanceof Classifier) {
 			Classifier classifier = (Classifier) port.getType();
 			ComponentOperations.realizedInterfaces(null, classifier, false,
 				provideds);
 
-			for (Iterator allParents = classifier.allParents().iterator(); allParents
-				.hasNext();) {
+			for (Classifier parent : classifier.allParents()) {
 
-				ComponentOperations.realizedInterfaces(null,
-					(Classifier) allParents.next(), false, provideds);
+				ComponentOperations.realizedInterfaces(null, parent, false,
+					provideds);
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) port,
+		return new UnionEObjectEList<Interface>((InternalEObject) port,
 			UMLPackage.Literals.PORT__PROVIDED, provideds.size(), provideds
 				.toArray());
 	}
@@ -225,9 +222,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getRequireds(Port port) {
-		EList requireds = new UniqueEList.FastCompare();
-
+	public static EList<Interface> getRequireds(Port port) {
+		EList<Interface> requireds = new UniqueEList.FastCompare<Interface>();
 		Type type = (Type) port.eGet(UMLPackage.Literals.TYPED_ELEMENT__TYPE,
 			false);
 
@@ -236,15 +232,13 @@
 			ComponentOperations.usedInterfaces(null, classifier, false,
 				requireds);
 
-			for (Iterator allParents = classifier.allParents().iterator(); allParents
-				.hasNext();) {
-
-				ComponentOperations.usedInterfaces(null,
-					(Classifier) allParents.next(), false, requireds);
+			for (Classifier parent : classifier.allParents()) {
+				ComponentOperations.usedInterfaces(null, parent, false,
+					requireds);
 			}
 		}
 
-		return new UnionEObjectEList((InternalEObject) port,
+		return new UnionEObjectEList<Interface>((InternalEObject) port,
 			UMLPackage.Literals.PORT__REQUIRED, requireds.size(), requireds
 				.toArray());
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileApplicationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileApplicationOperations.java
index bb6472e..17cb8bc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileApplicationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileApplicationOperations.java
@@ -8,13 +8,14 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProfileApplicationOperations.java,v 1.5 2006/01/25 18:51:32 khussey Exp $
+ * $Id: ProfileApplicationOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
 import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 
 import org.eclipse.uml2.uml.NamedElement;
@@ -59,7 +60,7 @@
 			.getEAnnotation(UMLPackage.eNS_URI);
 
 		if (eAnnotation != null) {
-			EList references = eAnnotation.getReferences();
+			EList<EObject> references = eAnnotation.getReferences();
 
 			if (references.size() > 0) {
 				return (EPackage) references.get(0);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileOperations.java
index fe34f7e..e0fe2da 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProfileOperations.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProfileOperations.java,v 1.29 2006/10/10 20:41:29 khussey Exp $
+ * $Id: ProfileOperations.java,v 1.30 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -22,6 +21,7 @@
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.UniqueEList;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -100,24 +100,21 @@
 	 * @generated NOT
 	 */
 	public static boolean validateMetaclassReferenceNotSpecialized(
-			Profile profile, DiagnosticChain diagnostics, Map context) {
+			Profile profile, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		boolean result = true;
 
-		for (Iterator referencedMetaclasses = profile
-			.getReferencedMetaclasses().iterator(); result
-			&& referencedMetaclasses.hasNext();) {
+		for (org.eclipse.uml2.uml.Class referencedMetaclass : profile
+			.getReferencedMetaclasses()) {
 
-			org.eclipse.uml2.uml.Class referencedMetaclass = (org.eclipse.uml2.uml.Class) referencedMetaclasses
-				.next();
+			for (TreeIterator<EObject> allContents = getAllContents(profile,
+				true, false); allContents.hasNext();) {
 
-			for (Iterator allContents = getAllContents(profile, true, false); allContents
-				.hasNext();) {
+				EObject eObject = allContents.next();
 
-				Object object = allContents.next();
-
-				if (object instanceof org.eclipse.uml2.uml.Package
+				if (eObject instanceof org.eclipse.uml2.uml.Package
 					&& containsSpecializations(
-						(org.eclipse.uml2.uml.Package) object,
+						(org.eclipse.uml2.uml.Package) eObject,
 						referencedMetaclass)) {
 
 					result = false;
@@ -127,12 +124,9 @@
 
 			if (result) {
 
-				for (Iterator allParents = referencedMetaclass.allParents()
-					.iterator(); allParents.hasNext();) {
+				for (Classifier parent : referencedMetaclass.allParents()) {
 
-					if (EcoreUtil.isAncestor(profile, (Classifier) allParents
-						.next())) {
-
+					if (EcoreUtil.isAncestor(profile, parent)) {
 						result = false;
 						break;
 					}
@@ -164,16 +158,14 @@
 	 * @generated NOT
 	 */
 	public static boolean validateReferencesSameMetamodel(Profile profile,
-			DiagnosticChain diagnostics, Map context) {
-		EList metamodels = new UniqueEList.FastCompare(profile
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
+		EList<Model> metamodels = new UniqueEList.FastCompare<Model>(profile
 			.getReferencedMetamodels());
 
-		for (Iterator referencedMetaclasses = profile
-			.getReferencedMetaclasses().iterator(); referencedMetaclasses
-			.hasNext();) {
+		for (org.eclipse.uml2.uml.Class referencedMetaclass : profile
+			.getReferencedMetaclasses()) {
 
-			metamodels.add(((org.eclipse.uml2.uml.Class) referencedMetaclasses
-				.next()).getModel());
+			metamodels.add(referencedMetaclass.getModel());
 		}
 
 		if (metamodels.size() != 1) {
@@ -282,7 +274,7 @@
 	 * @generated NOT
 	 */
 	public static EPackage define(Profile profile) {
-		Map options = new HashMap();
+		Map<String, String> options = new HashMap<String, String>();
 
 		options.put(UML2EcoreConverter.OPTION__ECORE_TAGGED_VALUES,
 			OPTION__PROCESS);
@@ -291,9 +283,9 @@
 		options.put(UML2EcoreConverter.OPTION__DUPLICATE_FEATURE_INHERITANCE,
 			OPTION__PROCESS);
 
-		Collection ePackages = convertToEcore(profile, options);
+		Collection<EPackage> ePackages = convertToEcore(profile, options);
 		EPackage definition = ePackages.size() == 1
-			? (EPackage) ePackages.iterator().next()
+			? ePackages.iterator().next()
 			: null;
 
 		if (definition != null) {
@@ -313,7 +305,7 @@
 		EAnnotation eAnnotation = profile.getEAnnotation(UMLPackage.eNS_URI);
 
 		if (eAnnotation != null) {
-			EList contents = eAnnotation.getContents();
+			EList<EObject> contents = eAnnotation.getContents();
 
 			if (contents.size() > 0) {
 				return (EPackage) contents.get(0);
@@ -330,10 +322,9 @@
 
 			if (profileDefinition != null) {
 
-				for (Iterator eClassifiers = profileDefinition
-					.getEClassifiers().iterator(); eClassifiers.hasNext();) {
+				for (EClassifier eClassifier : profileDefinition
+					.getEClassifiers()) {
 
-					EClassifier eClassifier = (EClassifier) eClassifiers.next();
 					EAnnotation eAnnotation = eClassifier
 						.getEAnnotation(UMLPackage.eNS_URI);
 
@@ -385,17 +376,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getReferencedMetaclasses(Profile profile) {
-		EList referencedMetaclasses = new UniqueEList.FastCompare();
+	public static EList<org.eclipse.uml2.uml.Class> getReferencedMetaclasses(
+			Profile profile) {
+		EList<org.eclipse.uml2.uml.Class> referencedMetaclasses = new UniqueEList.FastCompare<org.eclipse.uml2.uml.Class>();
 
-		for (Iterator metaclassReferences = profile.getMetaclassReferences()
-			.iterator(); metaclassReferences.hasNext();) {
+		for (ElementImport metaclassReference : profile
+			.getMetaclassReferences()) {
 
-			PackageableElement importedElement = ((ElementImport) metaclassReferences
-				.next()).getImportedElement();
+			PackageableElement importedElement = metaclassReference
+				.getImportedElement();
 
 			if (importedElement != null) {
-				referencedMetaclasses.add(importedElement);
+				referencedMetaclasses
+					.add((org.eclipse.uml2.uml.Class) importedElement);
 			}
 		}
 
@@ -407,31 +400,28 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getReferencedMetamodels(Profile profile) {
-		EList referencedMetamodels = new UniqueEList.FastCompare();
+	public static EList<Model> getReferencedMetamodels(Profile profile) {
+		EList<Model> referencedMetamodels = new UniqueEList.FastCompare<Model>();
 
-		for (Iterator metamodelReferences = profile.getMetamodelReferences()
-			.iterator(); metamodelReferences.hasNext();) {
+		for (PackageImport metamodelReference : profile
+			.getMetamodelReferences()) {
 
-			org.eclipse.uml2.uml.Package importedPackage = ((PackageImport) metamodelReferences
-				.next()).getImportedPackage();
+			org.eclipse.uml2.uml.Package importedPackage = metamodelReference
+				.getImportedPackage();
 
 			if (importedPackage != null) {
-				referencedMetamodels.add(importedPackage);
+				referencedMetamodels.add((Model) importedPackage);
 			}
 		}
 
 		return ECollections.unmodifiableEList(referencedMetamodels);
 	}
 
-	protected static EList getOwnedExtensions(Profile profile,
-			boolean requiredOnly, EList ownedExtensions) {
+	protected static EList<Extension> getOwnedExtensions(Profile profile,
+			boolean requiredOnly, EList<Extension> ownedExtensions) {
 
-		for (Iterator extensions = EcoreUtil.getObjectsByType(
-			profile.getPackagedElements(), UMLPackage.Literals.EXTENSION)
-			.iterator(); extensions.hasNext();) {
-
-			Extension extension = (Extension) extensions.next();
+		for (Extension extension : EcoreUtil.<Extension> getObjectsByType(
+			profile.getPackagedElements(), UMLPackage.Literals.EXTENSION)) {
 
 			if (!requiredOnly || extension.isRequired()) {
 				ownedExtensions.add(extension);
@@ -446,9 +436,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getOwnedExtensions(Profile profile, boolean requiredOnly) {
+	public static EList<Extension> getOwnedExtensions(Profile profile,
+			boolean requiredOnly) {
 		return ECollections.unmodifiableEList(getOwnedExtensions(profile,
-			requiredOnly, new UniqueEList.FastCompare()));
+			requiredOnly, new UniqueEList.FastCompare<Extension>()));
 	}
 
 } // ProfileOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PropertyOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PropertyOperations.java
index 13ee17e..c99e5d1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PropertyOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PropertyOperations.java
@@ -8,12 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PropertyOperations.java,v 1.34 2006/10/10 20:41:29 khussey Exp $
+ * $Id: PropertyOperations.java,v 1.35 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -113,7 +111,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateMultiplicityOfComposite(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		int upperBound = property.upperBound();
 
 		if (upperBound == LiteralUnlimitedNatural.UNLIMITED || upperBound > 1) {
@@ -151,23 +149,18 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSubsettingContextConforms(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
-		spLoop : for (Iterator sp = property.getSubsettedProperties()
-			.iterator(); sp.hasNext();) {
+		spLoop : for (Property subsettedProperty : property
+			.getSubsettedProperties()) {
 
-			Property subsettedProperty = (Property) sp.next();
+			for (Type subsettingContext : property.subsettingContext()) {
 
-			for (Iterator sc = property.subsettingContext().iterator(); sc
-				.hasNext();) {
+				for (Type spSubsettingContext : subsettedProperty
+					.subsettingContext()) {
 
-				Classifier subsettingContext = (Classifier) sc.next();
-
-				for (Iterator c = subsettedProperty.subsettingContext()
-					.iterator(); c.hasNext();) {
-
-					if (subsettingContext.conformsTo((Classifier) c.next())) {
+					if (subsettingContext.conformsTo(spSubsettingContext)) {
 						continue spLoop;
 					}
 				}
@@ -206,7 +199,7 @@
 	 * @generated
 	 */
 	public static boolean validateRedefinedPropertyInherited(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -241,16 +234,13 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSubsettingRules(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		Type type = property.getType();
 		int upperBound = property.upperBound();
 
-		for (Iterator subsettedProperties = property.getSubsettedProperties()
-			.iterator(); subsettedProperties.hasNext();) {
-
-			Property subsettedProperty = (Property) subsettedProperties.next();
+		for (Property subsettedProperty : property.getSubsettedProperties()) {
 			Type subsettedType = subsettedProperty.getType();
 			int subsettedUpperBound = subsettedProperty.upperBound();
 
@@ -289,7 +279,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateNavigableReadonly(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (property.isReadOnly() && property.getAssociation() != null
@@ -321,7 +311,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateDerivedUnionIsDerived(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (property.isDerivedUnion() && !property.isDerived()) {
@@ -351,7 +341,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateDerivedUnionIsReadOnly(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (property.isDerivedUnion() && !property.isReadOnly()) {
@@ -381,15 +371,12 @@
 	 * @generated NOT
 	 */
 	public static boolean validateSubsettedPropertyNames(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		String name = property.getName();
 
-		for (Iterator subsettedProperties = property.getSubsettedProperties()
-			.iterator(); subsettedProperties.hasNext();) {
-
-			Property subsettedProperty = (Property) subsettedProperties.next();
+		for (Property subsettedProperty : property.getSubsettedProperties()) {
 
 			if (safeEquals(name, subsettedProperty.getName())) {
 				result = false;
@@ -422,7 +409,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateDeploymentTarget(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = true;
 
 		if (!property.getDeployments().isEmpty()) {
@@ -459,7 +446,7 @@
 	 * @generated
 	 */
 	public static boolean validateBindingToAttribute(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -492,11 +479,8 @@
 	 */
 	public static boolean isAttribute(Property property, Property p) {
 
-		for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-			p).iterator(); nonNavigableInverseReferences.hasNext();) {
-
-			EObject eObject = ((EStructuralFeature.Setting) nonNavigableInverseReferences
-				.next()).getEObject();
+		for (EStructuralFeature.Setting nonNavigableInverseReference : getNonNavigableInverseReferences(p)) {
+			EObject eObject = nonNavigableInverseReference.getEObject();
 
 			if (eObject instanceof Classifier
 				&& ((Classifier) eObject).getAttributes().contains(p)) {
@@ -631,23 +615,20 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList subsettingContext(Property property) {
-		EList subsettingContext = new UniqueEList.FastCompare();
+	public static EList<Type> subsettingContext(Property property) {
+		EList<Type> subsettingContext = new UniqueEList.FastCompare<Type>();
 
 		Association association = property.getAssociation();
 
 		if (association == null) {
 			Namespace namespace = property.getNamespace();
 
-			if (namespace instanceof Classifier) {
-				subsettingContext.add(namespace);
+			if (namespace instanceof Type) {
+				subsettingContext.add((Type) namespace);
 			}
 		} else {
 
-			for (Iterator memberEnds = association.getMemberEnds().iterator(); memberEnds
-				.hasNext();) {
-
-				Property memberEnd = (Property) memberEnds.next();
+			for (Property memberEnd : association.getMemberEnds()) {
 
 				if (memberEnd != property) {
 					Type memberEndType = memberEnd.getType();
@@ -746,7 +727,7 @@
 			}
 		}
 
-		EList memberEnds = association.getMemberEnds();
+		EList<Property> memberEnds = association.getMemberEnds();
 
 		switch (memberEnds.size()) {
 			case 0 :
@@ -805,7 +786,8 @@
 				throw new IllegalStateException();
 			}
 
-			EList navigableOwnedEnds = association.getNavigableOwnedEnds();
+			EList<Property> navigableOwnedEnds = association
+				.getNavigableOwnedEnds();
 
 			if (isNavigable) {
 				navigableOwnedEnds.add(property);
@@ -825,13 +807,13 @@
 		Association association = property.getAssociation();
 
 		if (association != null) {
-			List memberEnds = association.getMemberEnds();
+			EList<Property> memberEnds = association.getMemberEnds();
 
 			if (memberEnds.size() == 2) {
 				int index = memberEnds.indexOf(property);
 
 				if (index != -1) {
-					return (Property) memberEnds.get(Math.abs(index - 1));
+					return memberEnds.get(Math.abs(index - 1));
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolStateMachineOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolStateMachineOperations.java
index c623f07..6a93dee 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolStateMachineOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolStateMachineOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolStateMachineOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ProtocolStateMachineOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 */
 	public static boolean validateProtocolTransitions(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +98,7 @@
 	 */
 	public static boolean validateEntryExitDo(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -133,7 +133,7 @@
 	 */
 	public static boolean validateDeepOrShallowHistory(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -166,7 +166,7 @@
 	 */
 	public static boolean validatePortsConnected(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -199,7 +199,7 @@
 	 */
 	public static boolean validateClassifierContext(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolTransitionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolTransitionOperations.java
index 8961a5a..eb50afb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolTransitionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ProtocolTransitionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ProtocolTransitionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ProtocolTransitionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateBelongsToPsm(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateAssociatedActions(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -127,7 +127,7 @@
 	 */
 	public static boolean validateRefersToOperation(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PseudostateOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PseudostateOperations.java
index 92cc8a9..0b9fb82 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PseudostateOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/PseudostateOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: PseudostateOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: PseudostateOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -66,7 +66,7 @@
 	 * @generated
 	 */
 	public static boolean validateInitialVertex(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -100,7 +100,7 @@
 	 * @generated
 	 */
 	public static boolean validateHistoryVertices(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -134,7 +134,7 @@
 	 * @generated
 	 */
 	public static boolean validateJoinVertex(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -168,7 +168,7 @@
 	 * @generated
 	 */
 	public static boolean validateTransitionsIncoming(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -202,7 +202,7 @@
 	 * @generated
 	 */
 	public static boolean validateForkVertex(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -236,7 +236,7 @@
 	 * @generated
 	 */
 	public static boolean validateTransitionsOutgoing(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -270,7 +270,7 @@
 	 * @generated
 	 */
 	public static boolean validateJunctionVertex(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -304,7 +304,7 @@
 	 * @generated
 	 */
 	public static boolean validateChoiceVertex(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -337,7 +337,7 @@
 	 * @generated
 	 */
 	public static boolean validateOutgoingFromInitial(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/QualifierValueOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/QualifierValueOperations.java
index dffa924..88c4355 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/QualifierValueOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/QualifierValueOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: QualifierValueOperations.java,v 1.2 2006/01/05 22:43:24 khussey Exp $
+ * $Id: QualifierValueOperations.java,v 1.3 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateQualifierAttribute(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateTypeOfQualifier(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -127,7 +127,7 @@
 	 */
 	public static boolean validateMultiplicityOfQualifier(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadExtentActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadExtentActionOperations.java
index 5be3377..8c3e104 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadExtentActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadExtentActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadExtentActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ReadExtentActionOperations.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateTypeIsClassifier(
 			ReadExtentAction readExtentAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMultiplicityOfResult(
 			ReadExtentAction readExtentAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadIsClassifiedObjectActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadIsClassifiedObjectActionOperations.java
index acff97e..a8ecc64 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadIsClassifiedObjectActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadIsClassifiedObjectActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadIsClassifiedObjectActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ReadIsClassifiedObjectActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateMultiplicityOfInput(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateNoType(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -128,7 +128,7 @@
 	 */
 	public static boolean validateMultiplicityOfOutput(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -161,7 +161,7 @@
 	 */
 	public static boolean validateBooleanResult(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkActionOperations.java
index 1f64c4f..0dbe594 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkActionOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ReadLinkActionOperations.java,v 1.5 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 * @generated
 	 */
 	public static boolean validateOneOpenEnd(ReadLinkAction readLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +98,7 @@
 	 */
 	public static boolean validateTypeAndOrdering(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -133,7 +133,7 @@
 	 */
 	public static boolean validateCompatibleMultiplicity(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -168,7 +168,7 @@
 	 */
 	public static boolean validateNavigableOpenEnd(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -207,7 +207,7 @@
 	 * @generated
 	 */
 	public static boolean validateVisibility(ReadLinkAction readLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndActionOperations.java
index 63ce268..98d1c0c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ReadLinkObjectEndActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -65,7 +65,7 @@
 	 */
 	public static boolean validateProperty(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +98,7 @@
 	 */
 	public static boolean validateAssociationOfAssociation(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -131,7 +131,7 @@
 	 */
 	public static boolean validateEndsOfAssociation(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -164,7 +164,7 @@
 	 */
 	public static boolean validateTypeOfObject(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -197,7 +197,7 @@
 	 */
 	public static boolean validateMultiplicityOfObject(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -230,7 +230,7 @@
 	 */
 	public static boolean validateTypeOfResult(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -263,7 +263,7 @@
 	 */
 	public static boolean validateMultiplicityOfResult(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndQualifierActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndQualifierActionOperations.java
index 69401be..2855c78 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndQualifierActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadLinkObjectEndQualifierActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadLinkObjectEndQualifierActionOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ReadLinkObjectEndQualifierActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -66,7 +66,7 @@
 	 */
 	public static boolean validateQualifierAttribute(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -99,7 +99,7 @@
 	 */
 	public static boolean validateAssociationOfAssociation(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -132,7 +132,7 @@
 	 */
 	public static boolean validateEndsOfAssociation(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -165,7 +165,7 @@
 	 */
 	public static boolean validateTypeOfObject(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -198,7 +198,7 @@
 	 */
 	public static boolean validateMultiplicityOfQualifier(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -231,7 +231,7 @@
 	 */
 	public static boolean validateMultiplicityOfObject(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -264,7 +264,7 @@
 	 */
 	public static boolean validateSameType(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -297,7 +297,7 @@
 	 */
 	public static boolean validateMultiplicityOfResult(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadSelfActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadSelfActionOperations.java
index f0b0e50..01644c6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadSelfActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadSelfActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadSelfActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ReadSelfActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 * @generated
 	 */
 	public static boolean validateContained(ReadSelfAction readSelfAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotStatic(ReadSelfAction readSelfAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -125,7 +125,7 @@
 	 * @generated
 	 */
 	public static boolean validateType(ReadSelfAction readSelfAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -157,7 +157,7 @@
 	 * @generated
 	 */
 	public static boolean validateMultiplicity(ReadSelfAction readSelfAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadStructuralFeatureActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadStructuralFeatureActionOperations.java
index 13eb58e..7885616 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadStructuralFeatureActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadStructuralFeatureActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadStructuralFeatureActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ReadStructuralFeatureActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateTypeAndOrdering(
 			ReadStructuralFeatureAction readStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			ReadStructuralFeatureAction readStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadVariableActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadVariableActionOperations.java
index 6f2505e..b3f82f9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadVariableActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReadVariableActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReadVariableActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ReadVariableActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 */
 	public static boolean validateTypeAndOrdering(
 			ReadVariableAction readVariableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -95,7 +95,7 @@
 	 */
 	public static boolean validateCompatibleMultiplicity(
 			ReadVariableAction readVariableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReceptionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReceptionOperations.java
index fe172f4..9d1fc89 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReceptionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReceptionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReceptionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: ReceptionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateNotQuery(Reception reception,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReclassifyObjectActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReclassifyObjectActionOperations.java
index 90b2d65..cdf28f0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReclassifyObjectActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReclassifyObjectActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReclassifyObjectActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ReclassifyObjectActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -61,7 +61,7 @@
 	 */
 	public static boolean validateClassifierNotAbstract(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -94,7 +94,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -127,7 +127,7 @@
 	 */
 	public static boolean validateInputPin(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableElementOperations.java
index 26b29b2..ff80712 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableElementOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableElementOperations.java,v 1.8 2006/11/29 02:00:49 khussey Exp $
+ * $Id: RedefinableElementOperations.java,v 1.9 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -22,6 +22,7 @@
 import org.eclipse.emf.common.util.UniqueEList;
 
 import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.UMLPlugin;
 
@@ -67,14 +68,11 @@
 	 */
 	public static boolean validateRedefinitionContextValid(
 			RedefinableElement redefinableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = true;
 
-		for (Iterator redefinedElements = redefinableElement
-			.getRedefinedElements().iterator(); redefinedElements.hasNext();) {
-
-			RedefinableElement redefinedElement = (RedefinableElement) redefinedElements
-				.next();
+		for (RedefinableElement redefinedElement : redefinableElement
+			.getRedefinedElements()) {
 
 			if (!redefinableElement
 				.isRedefinitionContextValid(redefinedElement)) {
@@ -113,14 +111,11 @@
 	 */
 	public static boolean validateRedefinitionConsistent(
 			RedefinableElement redefinableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = true;
 
-		for (Iterator redefinedElements = redefinableElement
-			.getRedefinedElements().iterator(); redefinedElements.hasNext();) {
-
-			RedefinableElement redefinedElement = (RedefinableElement) redefinedElements
-				.next();
+		for (RedefinableElement redefinedElement : redefinableElement
+			.getRedefinedElements()) {
 
 			if (!redefinedElement.isConsistentWith(redefinableElement)) {
 				result = false;
@@ -158,24 +153,19 @@
 	public static boolean isRedefinitionContextValid(
 			RedefinableElement redefinableElement,
 			RedefinableElement redefinable) {
-		EList redefinableRedefinitionContexts = redefinable
+		EList<Classifier> rRedefinitionContexts = redefinable
 			.getRedefinitionContexts();
 
-		for (Iterator redefinitionContexts = redefinableElement
-			.getRedefinitionContexts().iterator(); redefinitionContexts
-			.hasNext();) {
+		for (Classifier reRedefinitionContext : redefinableElement
+			.getRedefinitionContexts()) {
 
-			EList redefinitionContextAllParents = ((Classifier) redefinitionContexts
-				.next()).allParents();
+			EList<Classifier> reRedefinitionContextAllParents = reRedefinitionContext
+				.allParents();
 
-			for (Iterator rrc = redefinableRedefinitionContexts.iterator(); rrc
-				.hasNext();) {
+			for (Classifier rRedefinitionContext : rRedefinitionContexts) {
 
-				Classifier redefinableRedefinitionContext = (Classifier) rrc
-					.next();
-
-				if (redefinitionContextAllParents
-					.contains(redefinableRedefinitionContext)) {
+				if (reRedefinitionContextAllParents
+					.contains(rRedefinitionContext)) {
 
 					return true;
 				}
@@ -202,43 +192,41 @@
 		return false;
 	}
 
-	protected static EList getAllRedefinedElements(
-			RedefinableElement redefinableElement, EList allRedefinedElements) {
+	protected static EList<RedefinableElement> getAllRedefinedElements(
+			RedefinableElement redefinableElement,
+			EList<RedefinableElement> allRedefinedElements) {
 
-		for (Iterator redefinedElements = redefinableElement
-			.getRedefinedElements().iterator(); redefinedElements.hasNext();) {
-
-			Object redefinedElement = redefinedElements.next();
+		for (RedefinableElement redefinedElement : redefinableElement
+			.getRedefinedElements()) {
 
 			if (allRedefinedElements.add(redefinedElement)) {
-				getAllRedefinedElements((RedefinableElement) redefinedElement,
-					allRedefinedElements);
+				getAllRedefinedElements(redefinedElement, allRedefinedElements);
 			}
 		}
 
 		return allRedefinedElements;
 	}
 
-	protected static EList getAllRedefinedElements(
+	protected static EList<RedefinableElement> getAllRedefinedElements(
 			RedefinableElement redefinableElement) {
 		return getAllRedefinedElements(redefinableElement,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<RedefinableElement>());
 	}
 
-	protected static EList excludeRedefinedElements(EList redefineableElements) {
-		EList allRedefinedElements = new UniqueEList.FastCompare();
+	protected static <E extends Element> EList<E> excludeRedefinedElements(
+			EList<E> redefineableElements) {
+		EList<RedefinableElement> allRedefinedElements = new UniqueEList.FastCompare<RedefinableElement>();
 
-		for (Iterator re = redefineableElements.iterator(); re.hasNext();) {
-			Object redefineableElement = re.next();
+		for (Element redefinableElement : redefineableElements) {
 
-			if (redefineableElement instanceof RedefinableElement) {
+			if (redefinableElement instanceof RedefinableElement) {
 				getAllRedefinedElements(
-					(RedefinableElement) redefineableElement,
+					(RedefinableElement) redefinableElement,
 					allRedefinedElements);
 			}
 		}
 
-		for (Iterator re = redefineableElements.iterator(); re.hasNext();) {
+		for (Iterator<?> re = redefineableElements.iterator(); re.hasNext();) {
 
 			if (allRedefinedElements.contains(re.next())) {
 				re.remove();
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableTemplateSignatureOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableTemplateSignatureOperations.java
index b595aaa..4a9f007 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableTemplateSignatureOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RedefinableTemplateSignatureOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RedefinableTemplateSignatureOperations.java,v 1.7 2006/01/27 04:55:56 khussey Exp $
+ * $Id: RedefinableTemplateSignatureOperations.java,v 1.8 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -27,6 +27,7 @@
 import org.eclipse.uml2.common.util.UnionEObjectEList;
 import org.eclipse.uml2.uml.RedefinableElement;
 import org.eclipse.uml2.uml.RedefinableTemplateSignature;
+import org.eclipse.uml2.uml.TemplateParameter;
 import org.eclipse.uml2.uml.UMLPackage;
 
 import org.eclipse.uml2.uml.util.UMLValidator;
@@ -70,7 +71,7 @@
 	 */
 	public static boolean validateInheritedParameters(
 			RedefinableTemplateSignature redefinableTemplateSignature,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,19 +98,19 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getInheritedParameters(
+	public static EList<TemplateParameter> getInheritedParameters(
 			RedefinableTemplateSignature redefinableTemplateSignature) {
-		EList inheritedParameters = new UniqueEList.FastCompare();
+		EList<TemplateParameter> inheritedParameters = new UniqueEList.FastCompare<TemplateParameter>();
 
-		for (Iterator extendedSignatures = redefinableTemplateSignature
+		for (Iterator<RedefinableTemplateSignature> extendedSignatures = redefinableTemplateSignature
 			.getExtendedSignatures().iterator(); extendedSignatures.hasNext();) {
 
 			inheritedParameters
-				.addAll(((InternalEList) ((RedefinableTemplateSignature) extendedSignatures
+				.addAll(((InternalEList<TemplateParameter>) (extendedSignatures
 					.next()).getParameters()).basicList());
 		}
 
-		return new UnionEObjectEList(
+		return new UnionEObjectEList<TemplateParameter>(
 			(InternalEObject) redefinableTemplateSignature,
 			UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER,
 			inheritedParameters.size(), inheritedParameters.toArray());
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReduceActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReduceActionOperations.java
index 3bc90f8..1ed408f 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReduceActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReduceActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReduceActionOperations.java,v 1.2 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ReduceActionOperations.java,v 1.3 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,8 @@
 	 * @generated
 	 */
 	public static boolean validateInputTypeIsCollection(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -92,7 +93,8 @@
 	 * @generated
 	 */
 	public static boolean validateOutputTypesAreCompatible(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -124,7 +126,8 @@
 	 * @generated
 	 */
 	public static boolean validateReducerInputsOutput(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RegionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RegionOperations.java
index bd95f9a..ec2d434 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RegionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RegionOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RegionOperations.java,v 1.9 2006/11/29 02:00:49 khussey Exp $
+ * $Id: RegionOperations.java,v 1.10 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -79,7 +78,7 @@
 	 * @generated
 	 */
 	public static boolean validateInitialVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -113,7 +112,7 @@
 	 * @generated
 	 */
 	public static boolean validateDeepHistoryVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -147,7 +146,7 @@
 	 * @generated
 	 */
 	public static boolean validateShallowHistoryVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -179,7 +178,7 @@
 	 * @generated
 	 */
 	public static boolean validateOwned(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -329,14 +328,9 @@
 
 		if (redefinee != null && redefinee.isRedefinitionContextValid(region)) {
 			Region redefineeRegion = (Region) redefinee;
+			EList<Vertex> allSubvertices = getAllSubvertices(region);
 
-			EList allSubvertices = getAllSubvertices(region);
-
-			for (Iterator redefineeSubvertices = redefineeRegion
-				.getSubvertices().iterator(); redefineeSubvertices.hasNext();) {
-
-				Vertex redefineeSubvertex = (Vertex) redefineeSubvertices
-					.next();
+			for (Vertex redefineeSubvertex : redefineeRegion.getSubvertices()) {
 
 				if (redefineeSubvertex instanceof State) {
 					State redefinedState = ((State) redefineeSubvertex)
@@ -350,13 +344,13 @@
 				}
 			}
 
-			EList allTransitions = getAllTransitions(region);
+			EList<Transition> allTransitions = getAllTransitions(region);
 
-			for (Iterator redefineeTransitions = redefineeRegion
-				.getTransitions().iterator(); redefineeTransitions.hasNext();) {
+			for (Transition redefineeTransition : redefineeRegion
+				.getTransitions()) {
 
-				Transition redefinedTransition = ((Transition) redefineeTransitions
-					.next()).getRedefinedTransition();
+				Transition redefinedTransition = redefineeTransition
+					.getRedefinedTransition();
 
 				if (redefinedTransition != null
 					&& !allTransitions.contains(redefinedTransition)) {
@@ -371,8 +365,8 @@
 		return false;
 	}
 
-	protected static EList getAllExtendedRegions(Region region,
-			EList allExtendedRegions) {
+	protected static EList<Region> getAllExtendedRegions(Region region,
+			EList<Region> allExtendedRegions) {
 		Region extendedRegion = region.getExtendedRegion();
 
 		if (extendedRegion != null && allExtendedRegions.add(extendedRegion)) {
@@ -382,34 +376,30 @@
 		return allExtendedRegions;
 	}
 
-	protected static EList getAllExtendedRegions(Region region) {
-		return getAllExtendedRegions(region, new UniqueEList.FastCompare());
+	protected static EList<Region> getAllExtendedRegions(Region region) {
+		return getAllExtendedRegions(region,
+			new UniqueEList.FastCompare<Region>());
 	}
 
-	protected static EList getAllSubvertices(Region region) {
-		EList allSubvertices = new UniqueEList.FastCompare(region
-			.getSubvertices());
+	protected static EList<Vertex> getAllSubvertices(Region region) {
+		EList<Vertex> allSubvertices = new UniqueEList.FastCompare<Vertex>(
+			region.getSubvertices());
 
-		for (Iterator allExtendedRegions = getAllExtendedRegions(region)
-			.iterator(); allExtendedRegions.hasNext();) {
-
-			allSubvertices.addAll(((Region) allExtendedRegions.next())
-				.getSubvertices());
+		for (Region extendedRegion : getAllExtendedRegions(region)) {
+			allSubvertices.addAll(extendedRegion.getSubvertices());
 		}
 
 		return RedefinableElementOperations
 			.excludeRedefinedElements(allSubvertices);
 	}
 
-	protected static EList getAllTransitions(Region region) {
-		EList allTransitions = new UniqueEList.FastCompare(region
-			.getTransitions());
+	protected static EList<Transition> getAllTransitions(Region region) {
+		EList<Transition> allTransitions = new UniqueEList.FastCompare<Transition>(
+			region.getTransitions());
 
-		for (Iterator allExtendedRegions = getAllExtendedRegions(region)
-			.iterator(); allExtendedRegions.hasNext();) {
+		for (Region extendedRegion : getAllExtendedRegions(region)) {
 
-			allTransitions.addAll(((Region) allExtendedRegions.next())
-				.getTransitions());
+			allTransitions.addAll(extendedRegion.getTransitions());
 		}
 
 		return RedefinableElementOperations
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveStructuralFeatureValueActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveStructuralFeatureValueActionOperations.java
index 1a02c87..0b5b5a0 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveStructuralFeatureValueActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveStructuralFeatureValueActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveStructuralFeatureValueActionOperations.java,v 1.5 2006/04/05 13:50:02 khussey Exp $
+ * $Id: RemoveStructuralFeatureValueActionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateNonUniqueRemoval(
 			RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveVariableValueActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveVariableValueActionOperations.java
index 785de2f..3f499b3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveVariableValueActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/RemoveVariableValueActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: RemoveVariableValueActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: RemoveVariableValueActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateUnlimitedNatural(
 			RemoveVariableValueAction removeVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReplyActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReplyActionOperations.java
index 6a51a69..5c26dbd 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReplyActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ReplyActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ReplyActionOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: ReplyActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validatePinsMatchParameter(ReplyAction replyAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,8 @@
 	 * @generated
 	 */
 	public static boolean validateEventOnReplyToCallTrigger(
-			ReplyAction replyAction, DiagnosticChain diagnostics, Map context) {
+			ReplyAction replyAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/SendSignalActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/SendSignalActionOperations.java
index dfed03e..d491732 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/SendSignalActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/SendSignalActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: SendSignalActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: SendSignalActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateNumberOrder(
 			SendSignalAction sendSignalAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateTypeOrderingMultiplicity(
 			SendSignalAction sendSignalAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StartClassifierBehaviorActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StartClassifierBehaviorActionOperations.java
index d674335..152d32a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StartClassifierBehaviorActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StartClassifierBehaviorActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StartClassifierBehaviorActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: StartClassifierBehaviorActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			StartClassifierBehaviorAction startClassifierBehaviorAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateTypeHasClassifier(
 			StartClassifierBehaviorAction startClassifierBehaviorAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateMachineOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateMachineOperations.java
index aaea147..a276b5e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateMachineOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateMachineOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateMachineOperations.java,v 1.11 2006/11/29 02:00:49 khussey Exp $
+ * $Id: StateMachineOperations.java,v 1.12 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -73,7 +72,7 @@
 	 * @generated
 	 */
 	public static boolean validateClassifierContext(StateMachine stateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -105,7 +104,7 @@
 	 * @generated
 	 */
 	public static boolean validateContextClassifier(StateMachine stateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -137,7 +136,7 @@
 	 * @generated
 	 */
 	public static boolean validateConnectionPoints(StateMachine stateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -169,7 +168,7 @@
 	 * @generated
 	 */
 	public static boolean validateMethod(StateMachine stateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -313,13 +312,9 @@
 			&& redefinee.isRedefinitionContextValid(stateMachine)) {
 
 			StateMachine redefineeStateMachine = (StateMachine) redefinee;
+			EList<Region> allRegions = getAllRegions(stateMachine);
 
-			EList allRegions = getAllRegions(stateMachine);
-
-			for (Iterator redefineeRegions = redefineeStateMachine.getRegions()
-				.iterator(); redefineeRegions.hasNext();) {
-
-				Region redefineeRegion = (Region) redefineeRegions.next();
+			for (Region redefineeRegion : redefineeStateMachine.getRegions()) {
 				Region extendedRegion = redefineeRegion.getExtendedRegion();
 
 				if (allRegions.contains(extendedRegion)
@@ -335,15 +330,12 @@
 		return false;
 	}
 
-	protected static EList getAllExtendedStateMachines(
-			StateMachine stateMachine, EList allExtendedStateMachines) {
+	protected static EList<StateMachine> getAllExtendedStateMachines(
+			StateMachine stateMachine,
+			EList<StateMachine> allExtendedStateMachines) {
 
-		for (Iterator extendedStateMachines = stateMachine
-			.getExtendedStateMachines().iterator(); extendedStateMachines
-			.hasNext();) {
-
-			StateMachine extendedStateMachine = (StateMachine) extendedStateMachines
-				.next();
+		for (StateMachine extendedStateMachine : stateMachine
+			.getExtendedStateMachines()) {
 
 			if (allExtendedStateMachines.add(extendedStateMachine)) {
 				getAllExtendedStateMachines(extendedStateMachine,
@@ -354,24 +346,22 @@
 		return allExtendedStateMachines;
 	}
 
-	protected static EList getAllExtendedStateMachines(StateMachine stateMachine) {
+	protected static EList<StateMachine> getAllExtendedStateMachines(
+			StateMachine stateMachine) {
 		return getAllExtendedStateMachines(stateMachine,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<StateMachine>());
 	}
 
-	protected static EList getAllRegions(StateMachine stateMachine) {
-		EList allRegions = new UniqueEList.FastCompare(stateMachine
-			.getRegions());
+	protected static EList<Region> getAllRegions(StateMachine stateMachine) {
+		EList<Region> allRegions = new UniqueEList.FastCompare<Region>(
+			stateMachine.getRegions());
 
-		for (Iterator allExtendedStateMachines = getAllExtendedStateMachines(
-			stateMachine).iterator(); allExtendedStateMachines.hasNext();) {
-
-			allRegions.addAll(((StateMachine) allExtendedStateMachines.next())
-				.getRegions());
+		for (StateMachine extendedStateMachine : getAllExtendedStateMachines(stateMachine)) {
+			allRegions.addAll(extendedStateMachine.getRegions());
 		}
 
 		return RedefinableElementOperations
 			.excludeRedefinedElements(allRegions);
 	}
 
-} // StateMachineOperations
\ No newline at end of file
+} // StateMachineOperations
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateOperations.java
index f24f97f..74dc522 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StateOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StateOperations.java,v 1.8 2006/11/29 02:00:49 khussey Exp $
+ * $Id: StateOperations.java,v 1.9 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -78,7 +77,7 @@
 	 * @generated
 	 */
 	public static boolean validateSubmachineStates(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -112,7 +111,8 @@
 	 * @generated
 	 */
 	public static boolean validateDestinationsOrSourcesOfTransitions(
-			State state, DiagnosticChain diagnostics, Map context) {
+			State state, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -144,7 +144,7 @@
 	 * @generated
 	 */
 	public static boolean validateSubmachineOrRegions(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -176,7 +176,7 @@
 	 * @generated
 	 */
 	public static boolean validateCompositeStates(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -208,7 +208,7 @@
 	 * @generated
 	 */
 	public static boolean validateEntryOrExit(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -348,12 +348,9 @@
 		if (redefinee != null && redefinee.isRedefinitionContextValid(state)) {
 			State redefineeState = (State) redefinee;
 
-			EList allRegions = getAllRegions(state);
+			EList<Region> allRegions = getAllRegions(state);
 
-			for (Iterator redefineeRegions = redefineeState.getRegions()
-				.iterator(); redefineeRegions.hasNext();) {
-
-				Region redefineeRegion = (Region) redefineeRegions.next();
+			for (Region redefineeRegion : redefineeState.getRegions()) {
 				Region extendedRegion = redefineeRegion.getExtendedRegion();
 
 				if (allRegions.contains(extendedRegion)
@@ -386,8 +383,8 @@
 			: container.containingStateMachine();
 	}
 
-	protected static EList getAllRedefinedStates(State state,
-			EList allRedefinedStates) {
+	protected static EList<State> getAllRedefinedStates(State state,
+			EList<State> allRedefinedStates) {
 		State redefinedState = state.getRedefinedState();
 
 		if (redefinedState != null && allRedefinedStates.add(redefinedState)) {
@@ -397,17 +394,17 @@
 		return allRedefinedStates;
 	}
 
-	protected static EList getAllRedefinedStates(State state) {
-		return getAllRedefinedStates(state, new UniqueEList.FastCompare());
+	protected static EList<State> getAllRedefinedStates(State state) {
+		return getAllRedefinedStates(state,
+			new UniqueEList.FastCompare<State>());
 	}
 
-	protected static EList getAllRegions(State state) {
-		EList allRegions = new UniqueEList.FastCompare(state.getRegions());
+	protected static EList<Region> getAllRegions(State state) {
+		EList<Region> allRegions = new UniqueEList.FastCompare<Region>(state
+			.getRegions());
 
-		for (Iterator allRedefinedStates = getAllRedefinedStates(state)
-			.iterator(); allRedefinedStates.hasNext();) {
-
-			allRegions.addAll(((State) allRedefinedStates).getRegions());
+		for (State redefinedState : getAllRedefinedStates(state)) {
+			allRegions.addAll(redefinedState.getRegions());
 		}
 
 		return RedefinableElementOperations
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StereotypeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StereotypeOperations.java
index 6336ad8..77b47e6 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StereotypeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StereotypeOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StereotypeOperations.java,v 1.13 2006/05/02 14:55:08 khussey Exp $
+ * $Id: StereotypeOperations.java,v 1.14 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -26,6 +25,7 @@
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.uml2.uml.AggregationKind;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Extension;
 import org.eclipse.uml2.uml.Image;
 import org.eclipse.uml2.uml.ExtensionEnd;
@@ -83,7 +83,7 @@
 	 * @generated
 	 */
 	public static boolean validateNameNotClash(Stereotype stereotype,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -115,7 +115,7 @@
 	 * @generated
 	 */
 	public static boolean validateGeneralize(Stereotype stereotype,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -232,19 +232,17 @@
 		return keyword;
 	}
 
-	protected static EList getExtendedMetaclasses(Stereotype stereotype,
-			EList extendedMetaclasses) {
+	protected static EList<org.eclipse.uml2.uml.Class> getExtendedMetaclasses(
+			Stereotype stereotype,
+			EList<org.eclipse.uml2.uml.Class> extendedMetaclasses) {
 
-		for (Iterator ownedAttributes = stereotype.getOwnedAttributes()
-			.iterator(); ownedAttributes.hasNext();) {
+		for (Property ownedAttribute : stereotype.getOwnedAttributes()) {
 
-			Property property = (Property) ownedAttributes.next();
-
-			if (property.getAssociation() instanceof Extension) {
-				Type type = property.getType();
+			if (ownedAttribute.getAssociation() instanceof Extension) {
+				Type type = ownedAttribute.getType();
 
 				if (type instanceof org.eclipse.uml2.uml.Class) {
-					extendedMetaclasses.add(type);
+					extendedMetaclasses.add((org.eclipse.uml2.uml.Class) type);
 				}
 			}
 		}
@@ -257,9 +255,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getExtendedMetaclasses(Stereotype stereotype) {
+	public static EList<org.eclipse.uml2.uml.Class> getExtendedMetaclasses(
+			Stereotype stereotype) {
 		return ECollections.unmodifiableEList(getExtendedMetaclasses(
-			stereotype, new UniqueEList.FastCompare()));
+			stereotype,
+			new UniqueEList.FastCompare<org.eclipse.uml2.uml.Class>()));
 	}
 
 	/**
@@ -267,14 +267,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAllExtendedMetaclasses(Stereotype stereotype) {
-		EList allExtendedMetaclasses = getExtendedMetaclasses(stereotype,
-			new UniqueEList.FastCompare());
+	public static EList<org.eclipse.uml2.uml.Class> getAllExtendedMetaclasses(
+			Stereotype stereotype) {
+		EList<org.eclipse.uml2.uml.Class> allExtendedMetaclasses = getExtendedMetaclasses(
+			stereotype,
+			new UniqueEList.FastCompare<org.eclipse.uml2.uml.Class>());
 
-		for (Iterator allParents = stereotype.allParents().iterator(); allParents
-			.hasNext();) {
-
-			Object parent = allParents.next();
+		for (Classifier parent : stereotype.allParents()) {
 
 			if (parent instanceof Stereotype) {
 				getExtendedMetaclasses((Stereotype) parent,
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StringExpressionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StringExpressionOperations.java
index a979363..e2c6ffc 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StringExpressionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StringExpressionOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StringExpressionOperations.java,v 1.5 2006/01/05 22:43:26 khussey Exp $
+ * $Id: StringExpressionOperations.java,v 1.6 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -63,7 +62,7 @@
 	 * @generated
 	 */
 	public static boolean validateOperands(StringExpression stringExpression,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -98,7 +97,7 @@
 	 */
 	public static boolean validateSubexpressions(
 			StringExpression stringExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -122,20 +121,18 @@
 
 	protected static StringBuffer stringValue(
 			StringExpression stringExpression, StringBuffer stringValue) {
-		EList subExpressions = stringExpression.getSubExpressions();
+		EList<StringExpression> subExpressions = stringExpression
+			.getSubExpressions();
 
 		if (!subExpressions.isEmpty()) {
 
-			for (Iterator se = subExpressions.iterator(); se.hasNext();) {
-				stringValue((StringExpression) se.next(), stringValue);
+			for (StringExpression subExpression : subExpressions) {
+				stringValue(subExpression, stringValue);
 			}
 		} else {
 
-			for (Iterator op = stringExpression.getOperands().iterator(); op
-				.hasNext();) {
-
-				stringValue.append(((ValueSpecification) op.next())
-					.stringValue());
+			for (ValueSpecification operand : stringExpression.getOperands()) {
+				stringValue.append(operand.stringValue());
 			}
 		}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuralFeatureActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuralFeatureActionOperations.java
index 61982be..871d1b8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuralFeatureActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuralFeatureActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuralFeatureActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: StructuralFeatureActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 */
 	public static boolean validateNotStatic(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -96,7 +96,7 @@
 	 */
 	public static boolean validateSameType(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -129,7 +129,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -167,7 +167,7 @@
 	 */
 	public static boolean validateVisibility(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -200,7 +200,7 @@
 	 */
 	public static boolean validateOneFeaturingClassifier(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredActivityNodeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredActivityNodeOperations.java
index ef5f302..c9978a1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredActivityNodeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredActivityNodeOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredActivityNodeOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: StructuredActivityNodeOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateEdges(
 			StructuredActivityNode structuredActivityNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredClassifierOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredClassifierOperations.java
index d13a21f..9888934 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredClassifierOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/StructuredClassifierOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: StructuredClassifierOperations.java,v 1.6 2006/01/05 22:43:24 khussey Exp $
+ * $Id: StructuredClassifierOperations.java,v 1.7 2006/12/14 15:49:24 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -63,7 +63,7 @@
 	 */
 	public static boolean validateMultiplicities(
 			StructuredClassifier structuredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateBindingOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateBindingOperations.java
index b0fbd84..31fcc6e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateBindingOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateBindingOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateBindingOperations.java,v 1.5 2006/01/05 22:43:25 khussey Exp $
+ * $Id: TemplateBindingOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateParameterSubstitutionFormal(
 			TemplateBinding templateBinding, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateOneParameterSubstitution(
 			TemplateBinding templateBinding, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterOperations.java
index a889e6b..6cef5ff 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameterOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: TemplateParameterOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateMustBeCompatible(
 			TemplateParameter templateParameter, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterSubstitutionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterSubstitutionOperations.java
index 34e6d39..8202d3e 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterSubstitutionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateParameterSubstitutionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateParameterSubstitutionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: TemplateParameterSubstitutionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateMustBeCompatible(
 			TemplateParameterSubstitution templateParameterSubstitution,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateSignatureOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateSignatureOperations.java
index d4f03fb..4b44125 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateSignatureOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateSignatureOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateSignatureOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: TemplateSignatureOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateOwnElements(
 			TemplateSignature templateSignature, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateableElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateableElementOperations.java
index 55a4434..6bba690 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateableElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TemplateableElementOperations.java
@@ -8,15 +8,15 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TemplateableElementOperations.java,v 1.6 2006/01/27 04:55:56 khussey Exp $
+ * $Id: TemplateableElementOperations.java,v 1.7 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 
-import java.util.Iterator;
 import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.ParameterableElement;
 import org.eclipse.uml2.uml.TemplateableElement;
 
@@ -56,17 +56,14 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList parameterableElements(
+	public static EList<ParameterableElement> parameterableElements(
 			TemplateableElement templateableElement) {
-		EList parameterableElements = new UniqueEList.FastCompare();
+		EList<ParameterableElement> parameterableElements = new UniqueEList.FastCompare<ParameterableElement>();
 
-		for (Iterator allOwnedElements = templateableElement.allOwnedElements()
-			.iterator(); allOwnedElements.hasNext();) {
-
-			Object ownedElement = allOwnedElements.next();
+		for (Element ownedElement : templateableElement.allOwnedElements()) {
 
 			if (ownedElement instanceof ParameterableElement) {
-				parameterableElements.add(ownedElement);
+				parameterableElements.add((ParameterableElement) ownedElement);
 			}
 		}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TestIdentityActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TestIdentityActionOperations.java
index 484579c..be8e473 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TestIdentityActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TestIdentityActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TestIdentityActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: TestIdentityActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -62,7 +62,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoType(TestIdentityAction testIdentityAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,7 +97,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -130,7 +130,7 @@
 	 */
 	public static boolean validateResultIsBoolean(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TimeEventOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TimeEventOperations.java
index a003672..9138375 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TimeEventOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TimeEventOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TimeEventOperations.java,v 1.5 2006/01/05 22:43:25 khussey Exp $
+ * $Id: TimeEventOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateWhenNonNegative(TimeEvent timeEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateStartingTime(TimeEvent timeEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TransitionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TransitionOperations.java
index a4272b9..5082930 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TransitionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TransitionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TransitionOperations.java,v 1.9 2006/11/29 02:00:49 khussey Exp $
+ * $Id: TransitionOperations.java,v 1.10 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -75,7 +75,7 @@
 	 * @generated
 	 */
 	public static boolean validateForkSegmentGuards(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -107,7 +107,7 @@
 	 * @generated
 	 */
 	public static boolean validateJoinSegmentGuards(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -139,7 +139,7 @@
 	 * @generated
 	 */
 	public static boolean validateForkSegmentState(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -171,7 +171,7 @@
 	 * @generated
 	 */
 	public static boolean validateJoinSegmentState(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -205,7 +205,7 @@
 	 * @generated
 	 */
 	public static boolean validateOutgoingPseudostates(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -242,7 +242,7 @@
 	 * @generated
 	 */
 	public static boolean validateInitialTransition(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -275,7 +275,7 @@
 	 * @generated
 	 */
 	public static boolean validateSignaturesCompatible(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -362,7 +362,7 @@
 
 			Transition redefineeTransition = (Transition) redefinee;
 
-			EList sources = new UniqueEList.FastCompare();
+			EList<Vertex> sources = new UniqueEList.FastCompare<Vertex>();
 
 			Vertex source = transition.getSource();
 
@@ -385,8 +385,8 @@
 		return false;
 	}
 
-	protected static EList getAllRedefinedTransitions(Transition transition,
-			EList allRedefinedTransitions) {
+	protected static EList<Transition> getAllRedefinedTransitions(
+			Transition transition, EList<Transition> allRedefinedTransitions) {
 		Transition redefinedTransition = transition.getRedefinedTransition();
 
 		if (redefinedTransition != null
@@ -399,9 +399,10 @@
 		return allRedefinedTransitions;
 	}
 
-	protected static EList getAllRedefinedTransitions(Transition transition) {
+	protected static EList<Transition> getAllRedefinedTransitions(
+			Transition transition) {
 		return getAllRedefinedTransitions(transition,
-			new UniqueEList.FastCompare());
+			new UniqueEList.FastCompare<Transition>());
 	}
 
 } // TransitionOperations
\ No newline at end of file
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TypeOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TypeOperations.java
index 939c91c..9e6fb1c 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TypeOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/TypeOperations.java
@@ -8,12 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: TypeOperations.java,v 1.14 2006/05/02 20:18:32 khussey Exp $
+ * $Id: TypeOperations.java,v 1.15 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
-
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.UniqueEList;
@@ -84,34 +82,42 @@
 
 	protected static Property createOwnedProperty(Type type, final String name,
 			final Type propertyType, int lower, int upper) {
-		Property ownedProperty = (Property) new UMLSwitch() {
+		Property ownedProperty = new UMLSwitch<Property>() {
 
-			public Object caseArtifact(Artifact artifact) {
+			@Override
+			public Property caseArtifact(Artifact artifact) {
 				return artifact.createOwnedAttribute(name, propertyType);
 			}
 
-			public Object caseAssociation(Association association) {
+			@Override
+			public Property caseAssociation(Association association) {
 				return association.createOwnedEnd(name, propertyType);
 			}
 
-			public Object caseAssociationClass(AssociationClass associationClass) {
+			@Override
+			public Property caseAssociationClass(
+					AssociationClass associationClass) {
 				return associationClass
 					.createOwnedAttribute(name, propertyType);
 			}
 
-			public Object caseDataType(DataType dataType) {
+			@Override
+			public Property caseDataType(DataType dataType) {
 				return dataType.createOwnedAttribute(name, propertyType);
 			}
 
-			public Object caseInterface(Interface interface_) {
+			@Override
+			public Property caseInterface(Interface interface_) {
 				return interface_.createOwnedAttribute(name, propertyType);
 			}
 
-			public Object caseSignal(Signal signal) {
+			@Override
+			public Property caseSignal(Signal signal) {
 				return signal.createOwnedAttribute(name, propertyType);
 			}
 
-			public Object caseStructuredClassifier(
+			@Override
+			public Property caseStructuredClassifier(
 					StructuredClassifier structuredClassifier) {
 				return structuredClassifier.createOwnedAttribute(name,
 					propertyType);
@@ -144,7 +150,7 @@
 			Association association, boolean isNavigable,
 			AggregationKind aggregation, String name, int lower, int upper,
 			Type endType) {
-		EList ownedAttributes = getOwnedAttributes(type);
+		EList<Property> ownedAttributes = getOwnedAttributes(type);
 		Property associationEnd = createOwnedProperty(ownedAttributes == null
 			|| !isNavigable
 			? association
@@ -209,17 +215,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public static EList getAssociations(Type type) {
-		EList associations = new UniqueEList.FastCompare();
+	public static EList<Association> getAssociations(Type type) {
+		EList<Association> associations = new UniqueEList.FastCompare<Association>();
 
-		for (Iterator nonNavigableInverseReferences = getNonNavigableInverseReferences(
-			type).iterator(); nonNavigableInverseReferences.hasNext();) {
+		for (EStructuralFeature.Setting nonNavigableInverseReference : getNonNavigableInverseReferences(type)) {
 
-			EStructuralFeature.Setting setting = (EStructuralFeature.Setting) nonNavigableInverseReferences
-				.next();
-
-			if (setting.getEStructuralFeature() == UMLPackage.Literals.TYPED_ELEMENT__TYPE) {
-				EObject eObject = setting.getEObject();
+			if (nonNavigableInverseReference.getEStructuralFeature() == UMLPackage.Literals.TYPED_ELEMENT__TYPE) {
+				EObject eObject = nonNavigableInverseReference.getEObject();
 
 				if (eObject instanceof Property) {
 					Association association = ((Property) eObject)
@@ -236,31 +238,35 @@
 	}
 
 	public static Operation createOwnedOperation(Type type, final String name,
-			final EList parameterNames, final EList parameterTypes,
-			Type returnType) {
+			final EList<String> parameterNames,
+			final EList<Type> parameterTypes, Type returnType) {
 
 		if (getOwnedOperations(type) == null) {
 			throw new UnsupportedOperationException();
 		}
 
-		Operation ownedOperation = (Operation) new UMLSwitch() {
+		Operation ownedOperation = new UMLSwitch<Operation>() {
 
-			public Object caseArtifact(Artifact artifact) {
+			@Override
+			public Operation caseArtifact(Artifact artifact) {
 				return artifact.createOwnedOperation(name, parameterNames,
 					parameterTypes);
 			}
 
-			public Object caseClass(org.eclipse.uml2.uml.Class class_) {
+			@Override
+			public Operation caseClass(org.eclipse.uml2.uml.Class class_) {
 				return class_.createOwnedOperation(name, parameterNames,
 					parameterTypes);
 			}
 
-			public Object caseDataType(DataType dataType) {
+			@Override
+			public Operation caseDataType(DataType dataType) {
 				return dataType.createOwnedOperation(name, parameterNames,
 					parameterTypes);
 			}
 
-			public Object caseInterface(Interface interface_) {
+			@Override
+			public Operation caseInterface(Interface interface_) {
 				return interface_.createOwnedOperation(name, parameterNames,
 					parameterTypes);
 			}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UnmarshallActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UnmarshallActionOperations.java
index bdbea31..963b9ce 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UnmarshallActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UnmarshallActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UnmarshallActionOperations.java,v 1.5 2006/04/05 13:50:03 khussey Exp $
+ * $Id: UnmarshallActionOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -64,7 +64,7 @@
 	 * @generated
 	 */
 	public static boolean validateSameType(UnmarshallAction unmarshallAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -97,7 +97,7 @@
 	 */
 	public static boolean validateMultiplicityOfObject(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -130,7 +130,7 @@
 	 */
 	public static boolean validateNumberOfResult(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -163,7 +163,7 @@
 	 */
 	public static boolean validateTypeAndOrdering(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -197,7 +197,7 @@
 	 */
 	public static boolean validateMultiplicityOfResult(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -230,7 +230,7 @@
 	 */
 	public static boolean validateStructuralFeature(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -263,7 +263,7 @@
 	 */
 	public static boolean validateUnmarshallTypeIsClassifier(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UseCaseOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UseCaseOperations.java
index c31734b..12f7ee1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UseCaseOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/UseCaseOperations.java
@@ -8,11 +8,10 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UseCaseOperations.java,v 1.10 2006/05/23 16:07:41 khussey Exp $
+ * $Id: UseCaseOperations.java,v 1.11 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -22,6 +21,7 @@
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.UniqueEList;
 import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Include;
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPlugin;
@@ -68,7 +68,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateMustHaveName(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (isEmpty(useCase.getName())) {
 
@@ -97,11 +97,11 @@
 	 * @generated NOT
 	 */
 	public static boolean validateBinaryAssociations(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-		for (Iterator a = useCase.getAssociations().iterator(); a.hasNext();) {
+		for (Association association : useCase.getAssociations()) {
 
-			if (!((Association) a.next()).isBinary()) {
+			if (!association.isBinary()) {
 
 				if (diagnostics != null) {
 					diagnostics.add(new BasicDiagnostic(Diagnostic.WARNING,
@@ -130,21 +130,21 @@
 	 * @generated NOT
 	 */
 	public static boolean validateNoAssociationToUseCase(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-		for (Iterator a = useCase.getAssociations().iterator(); a.hasNext();) {
-			EList endTypes = ((Association) a.next()).getEndTypes();
+		for (Association association : useCase.getAssociations()) {
+			EList<Type> endTypes = association.getEndTypes();
 
 			if (endTypes.size() == 2) {
-				Type end1 = (Type) endTypes.get(0);
-				Type end2 = (Type) endTypes.get(1);
+				Type end1 = endTypes.get(0);
+				Type end2 = endTypes.get(1);
 
 				if (end1 instanceof UseCase && end2 instanceof UseCase) {
 					UseCase useCase1 = (UseCase) end1;
 					UseCase useCase2 = (UseCase) end2;
 
-					EList subjects = new UniqueEList.FastCompare(useCase1
-						.getSubjects());
+					EList<Classifier> subjects = new UniqueEList.FastCompare<Classifier>(
+						useCase1.getSubjects());
 					subjects.retainAll(useCase2.getSubjects());
 
 					if (!subjects.isEmpty()) {
@@ -182,7 +182,7 @@
 	 * @generated NOT
 	 */
 	public static boolean validateCannotIncludeSelf(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (useCase.allIncludedUseCases().contains(useCase)) {
 
@@ -202,13 +202,11 @@
 		return true;
 	}
 
-	protected static EList allIncludedUseCases(UseCase useCase,
-			EList allIncludedUseCases) {
+	protected static EList<UseCase> allIncludedUseCases(UseCase useCase,
+			EList<UseCase> allIncludedUseCases) {
 
-		for (Iterator includes = useCase.getIncludes().iterator(); includes
-			.hasNext();) {
-
-			UseCase addition = ((Include) includes.next()).getAddition();
+		for (Include include : useCase.getIncludes()) {
+			UseCase addition = include.getAddition();
 
 			if (addition != null && allIncludedUseCases.add(addition)) {
 				allIncludedUseCases(addition, allIncludedUseCases);
@@ -227,9 +225,9 @@
 	 * <!-- end-model-doc -->
 	 * @generated NOT
 	 */
-	public static EList allIncludedUseCases(UseCase useCase) {
+	public static EList<UseCase> allIncludedUseCases(UseCase useCase) {
 		return ECollections.unmodifiableEList(allIncludedUseCases(useCase,
-			new UniqueEList.FastCompare()));
+			new UniqueEList.FastCompare<UseCase>()));
 	}
 
 } // UseCaseOperations
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValuePinOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValuePinOperations.java
index 8102353..f30ed9d 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValuePinOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValuePinOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValuePinOperations.java,v 1.5 2006/05/16 15:07:25 khussey Exp $
+ * $Id: ValuePinOperations.java,v 1.6 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 * @generated
 	 */
 	public static boolean validateCompatibleType(ValuePin valuePin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -91,7 +91,7 @@
 	 * @generated
 	 */
 	public static boolean validateNoIncomingEdges(ValuePin valuePin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationActionOperations.java
index 20463ec..b976d3b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValueSpecificationActionOperations.java,v 1.4 2006/01/05 22:43:26 khussey Exp $
+ * $Id: ValueSpecificationActionOperations.java,v 1.5 2006/12/14 15:49:27 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateCompatibleType(
 			ValueSpecificationAction valueSpecificationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			ValueSpecificationAction valueSpecificationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationOperations.java
index 41dcc4a..5e2b0cb 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/ValueSpecificationOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: ValueSpecificationOperations.java,v 1.9 2006/11/08 20:26:58 khussey Exp $
+ * $Id: ValueSpecificationOperations.java,v 1.10 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -168,8 +168,9 @@
 
 	protected static void setValue(ValueSpecification valueSpecification,
 			final String newValue) {
-		new UMLSwitch() {
+		new UMLSwitch<Object>() {
 
+			@Override
 			public Object caseDuration(Duration duration) {
 				ValueSpecification expr = duration.getExpr();
 				return expr == null || expr instanceof Duration
@@ -177,6 +178,7 @@
 					: doSwitch(expr);
 			}
 
+			@Override
 			public Object caseInstanceValue(InstanceValue instanceValue) {
 				Type type = instanceValue.getType();
 
@@ -202,30 +204,35 @@
 				return instanceValue;
 			}
 
+			@Override
 			public Object caseLiteralBoolean(LiteralBoolean literalBoolean) {
 				literalBoolean.setValue(Boolean.valueOf(newValue)
 					.booleanValue());
 				return literalBoolean;
 			}
 
+			@Override
 			public Object caseLiteralInteger(LiteralInteger literalInteger) {
 				literalInteger.setValue(Integer.parseInt(newValue));
 				return literalInteger;
 			}
 
+			@Override
 			public Object caseLiteralString(LiteralString literalString) {
 				literalString.setValue(newValue);
 				return literalString;
 			}
 
+			@Override
 			public Object caseLiteralUnlimitedNatural(
 					LiteralUnlimitedNatural literalUnlimitedNatural) {
 				literalUnlimitedNatural.setValue(Integer.parseInt(newValue));
 				return literalUnlimitedNatural;
 			}
 
+			@Override
 			public Object caseOpaqueExpression(OpaqueExpression opaqueExpression) {
-				EList bodies = opaqueExpression.getBodies();
+				EList<String> bodies = opaqueExpression.getBodies();
 
 				if (bodies.isEmpty()) {
 					bodies.add(newValue);
@@ -236,6 +243,7 @@
 				return opaqueExpression;
 			}
 
+			@Override
 			public Object caseTimeExpression(TimeExpression timeExpression) {
 				ValueSpecification expr = timeExpression.getExpr();
 				return expr == null || expr instanceof TimeExpression
@@ -243,6 +251,7 @@
 					: doSwitch(expr);
 			}
 
+			@Override
 			public Object defaultCase(EObject eObject) {
 				throw new UnsupportedOperationException();
 			}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableActionOperations.java
index 6566698..2b3b868 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VariableActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: VariableActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -59,7 +59,7 @@
 	 */
 	public static boolean validateScopeOfVariable(
 			VariableAction variableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableOperations.java
index 180cd5f..db0bee1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/VariableOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: VariableOperations.java,v 1.4 2006/01/05 22:43:24 khussey Exp $
+ * $Id: VariableOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 * @generated
 	 */
 	public static boolean validateOwned(Variable variable,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteLinkActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteLinkActionOperations.java
index 8d1e4a6..6f4af76 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteLinkActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteLinkActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteLinkActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: WriteLinkActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -58,7 +58,7 @@
 	 * @generated
 	 */
 	public static boolean validateAllowAccess(WriteLinkAction writeLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteStructuralFeatureActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteStructuralFeatureActionOperations.java
index c8b5c21..75c4ca3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteStructuralFeatureActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteStructuralFeatureActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteStructuralFeatureActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: WriteStructuralFeatureActionOperations.java,v 1.5 2006/12/14 15:49:25 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateInputPin(
 			WriteStructuralFeatureAction writeStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			WriteStructuralFeatureAction writeStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteVariableActionOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteVariableActionOperations.java
index 64ad1c3..5dc3f66 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteVariableActionOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/WriteVariableActionOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: WriteVariableActionOperations.java,v 1.4 2006/01/05 22:43:25 khussey Exp $
+ * $Id: WriteVariableActionOperations.java,v 1.5 2006/12/14 15:49:26 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.operations;
 
@@ -60,7 +60,7 @@
 	 */
 	public static boolean validateSameType(
 			WriteVariableAction writeVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
@@ -93,7 +93,7 @@
 	 */
 	public static boolean validateMultiplicity(
 			WriteVariableAction writeVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO: implement this method
 		// -> specify the condition that violates the invariant
 		// -> verify the details of the diagnostic, including severity and message
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLHandler.java
index bab997c..cff7b3b 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLHandler.java
@@ -8,14 +8,13 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UML22UMLHandler.java,v 1.6 2006/04/26 15:48:53 khussey Exp $
+ * $Id: UML22UMLHandler.java,v 1.7 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
-import java.util.Iterator;
 import java.util.Map;
 
-import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.xmi.XMLHelper;
@@ -27,35 +26,33 @@
 		extends UMLHandler {
 
 	public UML22UMLHandler(XMLResource xmiResource, XMLHelper helper,
-			Map options) {
+			Map<?, ?> options) {
 		super(xmiResource, helper, options);
 	}
 
+	@Override
 	protected void createObject(EObject peekObject, EStructuralFeature feature) {
 
 		if (!isNull()) {
 			String xsiType = getXSIType();
 
-			Map typeMap = xsiType == null
+			Map<String, Map<EClassifier, String>> featureToTypeMap = xsiType == null
 				? UML22UMLExtendedMetaData.getFeatureToTypeMap()
-				: (Map) UML22UMLExtendedMetaData.getTypeToTypeMap()
-					.get(xsiType);
-			typeMap = typeMap == null
+				: UML22UMLExtendedMetaData.getTypeToTypeMap().get(xsiType);
+
+			Map<EClassifier, String> typeMap = featureToTypeMap == null
 				? null
-				: (Map) typeMap.get(feature.getName());
+				: featureToTypeMap.get(feature.getName());
 
 			if (typeMap != null) {
 				EObject eObject = peekObject instanceof AnyType
 					? (EObject) objects.get(objects.size() - 2)
 					: peekObject;
 
-				for (Iterator entries = typeMap.entrySet().iterator(); entries
-					.hasNext();) {
+				for (Map.Entry<EClassifier, String> entry : typeMap.entrySet()) {
 
-					Map.Entry entry = (Map.Entry) entries.next();
-
-					if (((EClass) entry.getKey()).isInstance(eObject)) {
-						xsiType = (String) entry.getValue();
+					if (entry.getKey().isInstance(eObject)) {
+						xsiType = entry.getValue();
 						break;
 					}
 				}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLLoadImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLLoadImpl.java
index a8eef07..5a0cec1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLLoadImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLLoadImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UML22UMLLoadImpl.java,v 1.1 2006/04/06 04:30:32 khussey Exp $
+ * $Id: UML22UMLLoadImpl.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -22,6 +22,7 @@
 		super(helper);
 	}
 
+	@Override
 	protected DefaultHandler makeDefaultHandler() {
 		return new UML22UMLHandler(resource, helper, options);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceFactoryImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceFactoryImpl.java
index 0ff7478..3b91cc5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceFactoryImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceFactoryImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  * 
- * $Id: UML22UMLResourceFactoryImpl.java,v 1.6 2006/04/26 15:48:53 khussey Exp $
+ * $Id: UML22UMLResourceFactoryImpl.java,v 1.7 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -39,25 +39,34 @@
 		super();
 	}
 
+	@Override
 	public Resource createResourceGen(URI uri) {
 		UML22UMLResource result = new UML22UMLResourceImpl(uri);
 		result.setEncoding(UML22UMLResource.DEFAULT_ENCODING);
 		return result;
 	}
 
+	@Override
 	public Resource createResource(URI uri) {
-		UML22UMLResource resource = (UML22UMLResource) super.createResource(uri);
+		UML22UMLResource resource = (UML22UMLResource) super
+			.createResource(uri);
 
-		Map defaultLoadOptions = resource.getDefaultLoadOptions();
+		Map<Object, Object> defaultLoadOptions = resource
+			.getDefaultLoadOptions();
 
-		EPackage.Registry ePackageRegistry = new EPackageRegistryImpl(EPackage.Registry.INSTANCE);
-		ePackageRegistry.put(UML22UMLResource.UML2_METAMODEL_NS_URI, UMLPackage.eINSTANCE);
-		ePackageRegistry.put("platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore", UMLPackage.eINSTANCE); //$NON-NLS-1$
+		EPackage.Registry ePackageRegistry = new EPackageRegistryImpl(
+			EPackage.Registry.INSTANCE);
+		ePackageRegistry.put(UML22UMLResource.UML2_METAMODEL_NS_URI,
+			UMLPackage.eINSTANCE);
+		ePackageRegistry
+			.put(
+				"platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore", UMLPackage.eINSTANCE); //$NON-NLS-1$
 
 		ResourceSet resourceSet = new ResourceSetImpl();
 		resourceSet.setPackageRegistry(ePackageRegistry);
 
-		Ecore2XMLRegistry ecore2xmlRegistry = new Ecore2XMLRegistryImpl(Ecore2XMLRegistry.INSTANCE);
+		Ecore2XMLRegistry ecore2xmlRegistry = new Ecore2XMLRegistryImpl(
+			Ecore2XMLRegistry.INSTANCE);
 		ecore2xmlRegistry
 			.put(
 				UML22UMLResource.UML2_METAMODEL_NS_URI,
@@ -70,11 +79,15 @@
 								true).getContents(),
 						Ecore2XMLPackage.Literals.XML_MAP));
 
-		ExtendedMetaData extendedMetaData = new UML22UMLExtendedMetaData(ePackageRegistry, ecore2xmlRegistry);
+		ExtendedMetaData extendedMetaData = new UML22UMLExtendedMetaData(
+			ePackageRegistry, ecore2xmlRegistry);
 
-		defaultLoadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
-		defaultLoadOptions.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.FALSE);
-		defaultLoadOptions.put(XMLResource.OPTION_RESOURCE_HANDLER, new UML22UMLResourceHandler());
+		defaultLoadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA,
+			extendedMetaData);
+		defaultLoadOptions.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING,
+			Boolean.FALSE);
+		defaultLoadOptions.put(XMLResource.OPTION_RESOURCE_HANDLER,
+			new UML22UMLResourceHandler());
 
 		return resource;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceImpl.java
index ba6d1ec..4ae0887 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UML22UMLResourceImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UML22UMLResourceImpl.java,v 1.2 2006/04/26 15:48:53 khussey Exp $
+ * $Id: UML22UMLResourceImpl.java,v 1.3 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -24,6 +24,7 @@
 		super(uri);
 	}
 
+	@Override
 	protected XMLLoad createXMLLoad() {
 		return new UML22UMLLoadImpl(createXMLHelper());
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLHandler.java
index 3f87edb..7b3bd95 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,12 +8,11 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLHandler.java,v 1.1 2005/12/07 14:17:51 khussey Exp $
+ * $Id: UMLHandler.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.URI;
@@ -29,46 +28,42 @@
 import org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler;
 import org.eclipse.emf.ecore.xml.type.AnyType;
 
-
 public class UMLHandler
 		extends SAXXMIHandler {
 
-	protected final Map urisToProxies = new HashMap();
+	protected final Map<URI, Map<String, EObject>> urisToProxies = new HashMap<URI, Map<String, EObject>>();
 
-	public UMLHandler(XMLResource xmiResource, XMLHelper helper, Map options) {
+	public UMLHandler(XMLResource xmiResource, XMLHelper helper,
+			Map<?, ?> options) {
 		super(xmiResource, helper, options);
 	}
 
+	@Override
 	public void endDocument() {
 		super.endDocument();
 
 		if (extendedMetaData != null) {
 
-			for (Iterator demandedPackages = extendedMetaData
-				.demandedPackages().iterator(); demandedPackages.hasNext();) {
-
-				EPackage ePackage = (EPackage) demandedPackages.next();
-				String nsURI = ePackage.getNsURI();
+			for (EPackage demandedPackage : extendedMetaData.demandedPackages()) {
+				String nsURI = demandedPackage.getNsURI();
 
 				if (nsURI != null) {
 
 					if (urisToLocations != null) {
-						URI locationURI = (URI) urisToLocations.get(nsURI);
+						URI locationURI = urisToLocations.get(nsURI);
 
 						if (locationURI != null) {
 							Resource resource = new ResourceImpl();
 							resource.setURI(locationURI);
-							resource.getContents().add(ePackage);
+							resource.getContents().add(demandedPackage);
 						}
 					}
 
-					for (Iterator entries = helper.getPrefixToNamespaceMap()
-						.iterator(); entries.hasNext();) {
-
-						Map.Entry entry = (Map.Entry) entries.next();
+					for (Map.Entry<String, String> entry : helper
+						.getPrefixToNamespaceMap()) {
 
 						if (nsURI.equals(entry.getValue())) {
-							ePackage.setNsPrefix((String) entry.getKey());
+							demandedPackage.setNsPrefix(entry.getKey());
 						}
 					}
 				}
@@ -76,6 +71,7 @@
 		}
 	}
 
+	@Override
 	protected EObject validateCreateObjectFromFactory(EFactory factory,
 			String typeName, EObject newObject, EStructuralFeature feature) {
 
@@ -83,13 +79,15 @@
 			&& newObject.eIsProxy() && !sameDocumentProxies.contains(newObject)) {
 
 			URI proxyURI = ((InternalEObject) newObject).eProxyURI();
-			Map typeNamesToProxies = (Map) urisToProxies.get(proxyURI);
+			Map<String, EObject> typeNamesToProxies = urisToProxies
+				.get(proxyURI);
 
 			if (typeNamesToProxies == null) {
-				urisToProxies.put(proxyURI, typeNamesToProxies = new HashMap());
+				urisToProxies.put(proxyURI,
+					typeNamesToProxies = new HashMap<String, EObject>());
 			}
 
-			EObject proxy = (EObject) typeNamesToProxies.get(typeName);
+			EObject proxy = typeNamesToProxies.get(typeName);
 
 			if (proxy == null) {
 				typeNamesToProxies.put(typeName, proxy = newObject);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLLoadImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLLoadImpl.java
index 58dbaf5..eefd021 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLLoadImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLLoadImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation 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,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLLoadImpl.java,v 1.2 2005/12/12 18:11:59 khussey Exp $
+ * $Id: UMLLoadImpl.java,v 1.3 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -24,6 +24,7 @@
 		super(helper);
 	}
 
+	@Override
 	protected DefaultHandler makeDefaultHandler() {
 		return new UMLHandler(resource, helper, options);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceFactoryImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceFactoryImpl.java
index 2b22605..cad6954 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceFactoryImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceFactoryImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLResourceFactoryImpl.java,v 1.8 2006/06/06 21:05:41 khussey Exp $
+ * $Id: UMLResourceFactoryImpl.java,v 1.9 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -59,19 +59,20 @@
 		return result;
 	}
 
+	@Override
 	public Resource createResource(URI uri) {
 		UMLResource resource = (UMLResource) createResourceGen(uri);
 
 		resource.setXMIVersion("2.1"); //$NON-NLS-1$
 
-		Map defaultLoadOptions = resource.getDefaultLoadOptions();
+		Map<Object, Object> defaultLoadOptions = resource.getDefaultLoadOptions();
 
 		defaultLoadOptions.put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE);
 		defaultLoadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
 		defaultLoadOptions.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
 		defaultLoadOptions.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
 
-		Map defaultSaveOptions = resource.getDefaultSaveOptions();
+		Map<Object, Object> defaultSaveOptions = resource.getDefaultSaveOptions();
 
 		defaultSaveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
 		defaultSaveOptions.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceImpl.java
index b79f6d0..e1328d2 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/UMLResourceImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLResourceImpl.java,v 1.3 2006/04/26 15:48:53 khussey Exp $
+ * $Id: UMLResourceImpl.java,v 1.4 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -40,14 +40,17 @@
 		super(uri);
 	}
 
+	@Override
 	protected XMLLoad createXMLLoad() {
 		return new UMLLoadImpl(createXMLHelper());
 	}
 
+	@Override
 	protected boolean useIDAttributes() {
 		return false;
 	}
 
+	@Override
 	protected boolean useUUIDs() {
 		return true;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
index 85c9b59..d52eae3 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: XMI2UMLHandler.java,v 1.4 2006/10/18 18:30:51 khussey Exp $
+ * $Id: XMI2UMLHandler.java,v 1.5 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -49,10 +49,11 @@
 
 	protected final static String IDREF_ATTRIB = XMIResource.XMI_NS + ':' + XMI_IDREF;
 
-	public XMI2UMLHandler(XMLResource xmiResource, XMLHelper helper, Map options) {
+	public XMI2UMLHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) {
 		super(xmiResource, helper, options);
 	}
 
+	@Override
 	protected void handleProxy(InternalEObject proxy, String uriLiteral) {
 
 		if (uriLiteral.startsWith(XMI2UMLResource.UML_METAMODEL_URI)
@@ -80,6 +81,7 @@
 		super.handleProxy(proxy, uriLiteral);
 	}
 
+	@Override
 	protected void processElement(String name, String prefix, String localName) {
 
 		if (EMOFExtendedMetaData.EXTENSION.equals(localName)
@@ -94,6 +96,7 @@
 		}
 	}
 
+	@Override
 	public void endElement(String uri, String localName, String name) {
 
 		if (types.peek() == ECORE_EXTENSION_TYPE) {
@@ -106,6 +109,7 @@
 		}
 	}
 
+	@Override
 	protected void setAttribValue(EObject object, String name, String value) {
 
 		if (IDREF_ATTRIB.equals(name)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHelperImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHelperImpl.java
index 391c3fb..29bb5be 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHelperImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHelperImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: XMI2UMLHelperImpl.java,v 1.1 2006/04/26 15:48:53 khussey Exp $
+ * $Id: XMI2UMLHelperImpl.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -25,6 +25,7 @@
 		super(resource);
 	}
 
+	@Override
 	public String getHREF(EObject obj) {
 		String href = super.getHREF(obj);
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLLoadImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLLoadImpl.java
index ae9a9d6..1ab9352 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLLoadImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLLoadImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: XMI2UMLLoadImpl.java,v 1.1 2006/04/26 15:48:53 khussey Exp $
+ * $Id: XMI2UMLLoadImpl.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -22,6 +22,7 @@
 		super(helper);
 	}
 
+	@Override
 	protected DefaultHandler makeDefaultHandler() {
 		return new XMI2UMLHandler(resource, helper, options);
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceFactoryImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceFactoryImpl.java
index 9848e26..8c5210a 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceFactoryImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceFactoryImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  * 
- * $Id: XMI2UMLResourceFactoryImpl.java,v 1.3 2006/10/10 20:41:29 khussey Exp $
+ * $Id: XMI2UMLResourceFactoryImpl.java,v 1.4 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -30,12 +30,14 @@
 		super();
 	}
 
+	@Override
 	public Resource createResourceGen(URI uri) {
 		XMI2UMLResource result = new XMI2UMLResourceImpl(uri);
 		result.setEncoding(XMI2UMLResource.DEFAULT_ENCODING);
 		return result;
 	}
 
+	@Override
 	public Resource createResource(URI uri) {
 		XMI2UMLResource resource = (XMI2UMLResource) super.createResource(uri);
 
@@ -45,7 +47,7 @@
 		resource.getDefaultLoadOptions().put(
 			XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
 
-		Map defaultSaveOptions = resource.getDefaultSaveOptions();
+		Map<Object, Object> defaultSaveOptions = resource.getDefaultSaveOptions();
 
 		defaultSaveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA,
 			extendedMetaData);
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceImpl.java
index ac00987..79e8938 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLResourceImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: XMI2UMLResourceImpl.java,v 1.1 2006/04/26 15:48:53 khussey Exp $
+ * $Id: XMI2UMLResourceImpl.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -26,18 +26,22 @@
 		super(uri);
 	}
 
+	@Override
 	protected XMLHelper createXMLHelper() {
 		return new XMI2UMLHelperImpl(this);
 	}
 
+	@Override
 	protected XMLLoad createXMLLoad() {
 		return new XMI2UMLLoadImpl(createXMLHelper());
 	}
 
+	@Override
 	protected XMLSave createXMLSave() {
 		return new XMI2UMLSaveImpl(createXMLHelper());
 	}
 
+	@Override
 	protected boolean assignIDsWhileLoading() {
 		return false;
 	}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
index 13e439b..99346a7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: XMI2UMLSaveImpl.java,v 1.1 2006/04/26 15:48:53 khussey Exp $
+ * $Id: XMI2UMLSaveImpl.java,v 1.2 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.internal.resource;
 
@@ -26,6 +26,7 @@
 		super(helper);
 	}
 
+	@Override
 	protected void saveContainedMany(EObject eObject,
 			EStructuralFeature eStructuralFeature) {
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLExtendedMetaData.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLExtendedMetaData.java
index 24ad513..ce42e54 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLExtendedMetaData.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLExtendedMetaData.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  * 
- * $Id: UML22UMLExtendedMetaData.java,v 1.4 2006/10/10 20:41:29 khussey Exp $
+ * $Id: UML22UMLExtendedMetaData.java,v 1.5 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.resource;
 
@@ -16,6 +16,7 @@
 import java.util.Map;
 
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.mapping.ecore2xml.Ecore2XMLRegistry;
 import org.eclipse.emf.mapping.ecore2xml.util.Ecore2XMLExtendedMetaData;
@@ -24,12 +25,12 @@
 public class UML22UMLExtendedMetaData
 		extends Ecore2XMLExtendedMetaData {
 
-	protected static Map uriMap = null;
+	protected static Map<URI, URI> uriMap = null;
 
-	public static Map getURIMap() {
+	public static Map<URI, URI> getURIMap() {
 
 		if (uriMap == null) {
-			uriMap = new HashMap();
+			uriMap = new HashMap<URI, URI>();
 
 			uriMap.put(URI.createURI(UML22UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI), URI.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI));
 			uriMap.put(URI.createURI(UML22UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI), URI.createURI(UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI));
@@ -47,12 +48,12 @@
 		return uriMap;
 	}
 
-	protected static Map fragmentMap = null;
+	protected static Map<String, String> fragmentMap = null;
 
-	public static Map getFragmentMap() {
+	public static Map<String, String> getFragmentMap() {
 
 		if (fragmentMap == null) {
-			fragmentMap = new HashMap();
+			fragmentMap = new HashMap<String, String>();
 
 			// EcorePrimitiveTypes.library.uml2 -> EcorePrimitiveTypes.library.uml
 
@@ -2324,46 +2325,46 @@
 		return fragmentMap;
 	}
 
-	protected static Map typeToTypeMap = null;
+	protected static Map<String, Map<String, Map<EClassifier, String>>> typeToTypeMap = null;
 
-	public static Map getTypeToTypeMap() {
+	public static Map<String, Map<String, Map<EClassifier, String>>> getTypeToTypeMap() {
 		
 		if (typeToTypeMap == null) {
-			typeToTypeMap = new HashMap();
+			typeToTypeMap = new HashMap<String, Map<String, Map<EClassifier, String>>>();
 			
-			Map typeMap = null;
-			Map featureMap = null;
+			Map<EClassifier, String> typeMap = null;
+			Map<String, Map<EClassifier, String>> featureMap = null;
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.INTERACTION, "uml:EventOccurrence"); //$NON-NLS-1$
 			typeMap.put(UMLPackage.Literals.INTERACTION_OPERAND, "uml:EventOccurrence"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("fragment", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:Stop", featureMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.DESTROY_LINK_ACTION, "uml:LinkEndDestructionData"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("endData", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:LinkEndCreationData", featureMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:LinkEndData", featureMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.ACTIVITY, "uml:CallBehaviorAction"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("node", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:ApplyFunctionAction", featureMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.ACTIVITY, "uml:Action"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("node", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:DurationObservationAction", featureMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:TimeObservationAction", featureMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.BEHAVIORED_CLASSIFIER, "uml:Trigger"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("ownedTrigger", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:AnyTrigger", featureMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:CallTrigger", featureMap); //$NON-NLS-1$
@@ -2371,15 +2372,15 @@
 			typeToTypeMap.put("uml:SignalTrigger", featureMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:TimeTrigger", featureMap); //$NON-NLS-1$
 			
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.NAMESPACE, "uml:Dependency"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("packagedElement", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:Permission", featureMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.NAMED_ELEMENT, "uml:OpaqueExpression"); //$NON-NLS-1$
-			featureMap = new HashMap();
+			featureMap = new HashMap<String, Map<EClassifier, String>>();
 			featureMap.put("mapping", typeMap); //$NON-NLS-1$
 			featureMap.put("selector", typeMap); //$NON-NLS-1$
 			typeToTypeMap.put("uml:Expression", featureMap); //$NON-NLS-1$
@@ -2388,82 +2389,82 @@
 		return typeToTypeMap;
 	}
 
-	protected static Map featureToTypeMap = null;
+	protected static Map<String, Map<EClassifier, String>> featureToTypeMap = null;
 
-	public static Map getFeatureToTypeMap() {
+	public static Map<String, Map<EClassifier, String>> getFeatureToTypeMap() {
 		
 		if (featureToTypeMap == null) {
-			featureToTypeMap = new HashMap();
+			featureToTypeMap = new HashMap<String, Map<EClassifier, String>>();
 			
-			Map typeMap = null;
+			Map<EClassifier, String> typeMap = null;
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.INTERACTION_USE, "uml:InputPin"); //$NON-NLS-1$
 			featureToTypeMap.put("argument", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.COMMENT, "uml:StringExpression"); //$NON-NLS-1$
 			featureToTypeMap.put("bodyExpression", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.OPAQUE_ACTION, "uml:Duration"); //$NON-NLS-1$
 			featureToTypeMap.put("duration", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.TRANSITION, "uml:Activity"); //$NON-NLS-1$
 			featureToTypeMap.put("effect", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.STATE, "uml:Activity"); //$NON-NLS-1$
 			featureToTypeMap.put("doActivity", typeMap); //$NON-NLS-1$
 			featureToTypeMap.put("entry", typeMap); //$NON-NLS-1$
 			featureToTypeMap.put("exit", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.BEHAVIORAL_FEATURE, "uml:Parameter"); //$NON-NLS-1$
 			featureToTypeMap.put("formalParameter", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.OPAQUE_ACTION, "uml:TimeExpression"); //$NON-NLS-1$
 			featureToTypeMap.put("now", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.TRIGGER, "uml:Operation"); //$NON-NLS-1$
 			featureToTypeMap.put("operation", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.BEHAVIORED_CLASSIFIER, "uml:StateMachine"); //$NON-NLS-1$
 			featureToTypeMap.put("ownedStateMachine", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.CLASSIFIER, "uml:RedefinableTemplateSignature"); //$NON-NLS-1$
 			featureToTypeMap.put("ownedTemplateSignature", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.PACKAGE, "uml:PackageMerge"); //$NON-NLS-1$
 			featureToTypeMap.put("packageExtension", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.NAMESPACE, "uml:PackageImport"); //$NON-NLS-1$
 			featureToTypeMap.put("packageImport", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.MESSAGE_END, "uml:Message"); //$NON-NLS-1$
 			featureToTypeMap.put("receiveMessage", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.BEHAVIORAL_FEATURE, "uml:Parameter"); //$NON-NLS-1$
 			featureToTypeMap.put("returnResult", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.LIFELINE, "uml:OpaqueExpression"); //$NON-NLS-1$
 			featureToTypeMap.put("selector", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.MESSAGE_END, "uml:Message"); //$NON-NLS-1$
 			featureToTypeMap.put("sendMessage", typeMap); //$NON-NLS-1$
 
-			typeMap = new HashMap();
+			typeMap = new HashMap<EClassifier, String>();
 			typeMap.put(UMLPackage.Literals.TRIGGER, "uml:Signal"); //$NON-NLS-1$
 			featureToTypeMap.put("signal", typeMap); //$NON-NLS-1$			
 		}
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLResourceHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLResourceHandler.java
index f6b3c87..c5e7506 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLResourceHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/UML22UMLResourceHandler.java
@@ -8,13 +8,12 @@
  * Contributors:
  *   IBM - initial API and implementation
  * 
- * $Id: UML22UMLResourceHandler.java,v 1.29 2006/11/29 02:00:12 khussey Exp $
+ * $Id: UML22UMLResourceHandler.java,v 1.30 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.resource;
 
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -77,6 +76,7 @@
 import org.eclipse.uml2.uml.InteractionUse;
 import org.eclipse.uml2.uml.Message;
 import org.eclipse.uml2.uml.MessageEnd;
+import org.eclipse.uml2.uml.MessageEvent;
 import org.eclipse.uml2.uml.MessageOccurrenceSpecification;
 import org.eclipse.uml2.uml.MessageSort;
 import org.eclipse.uml2.uml.MultiplicityElement;
@@ -160,17 +160,16 @@
 	protected static final String TAG_DEFINITION__SYMBOL = "symbol"; //$NON-NLS-1$
 
 	protected AnyType getExtension(XMLResource resource, EObject eObject) {
-		return (AnyType) resource.getEObjectToExtensionMap().get(eObject);
+		return resource.getEObjectToExtensionMap().get(eObject);
 	}
 
 	protected AnyType putExtension(XMLResource resource, EObject eObject,
 			AnyType extension) {
-		return (AnyType) resource.getEObjectToExtensionMap().put(eObject,
-			extension);
+		return resource.getEObjectToExtensionMap().put(eObject, extension);
 	}
 
 	protected AnyType removeExtension(XMLResource resource, EObject eObject) {
-		return (AnyType) resource.getEObjectToExtensionMap().remove(eObject);
+		return resource.getEObjectToExtensionMap().remove(eObject);
 	}
 
 	protected Object getValue(FeatureMap featureMap, String name) {
@@ -179,8 +178,9 @@
 
 	protected Object getValue(FeatureMap featureMap, String name, boolean remove) {
 
-		for (Iterator entries = featureMap.iterator(); entries.hasNext();) {
-			FeatureMap.Entry entry = (FeatureMap.Entry) entries.next();
+		for (Iterator<FeatureMap.Entry> entries = featureMap.iterator(); entries
+			.hasNext();) {
+			FeatureMap.Entry entry = entries.next();
 
 			if (name.equals(entry.getEStructuralFeature().getName())) {
 
@@ -195,16 +195,17 @@
 		return null;
 	}
 
-	protected Collection getValues(FeatureMap featureMap, String name) {
+	protected Collection<Object> getValues(FeatureMap featureMap, String name) {
 		return getValues(featureMap, name, false);
 	}
 
-	protected Collection getValues(FeatureMap featureMap, String name,
+	protected Collection<Object> getValues(FeatureMap featureMap, String name,
 			boolean remove) {
-		Collection values = new UniqueEList.FastCompare();
+		Collection<Object> values = new UniqueEList.FastCompare<Object>();
 
-		for (Iterator entries = featureMap.iterator(); entries.hasNext();) {
-			FeatureMap.Entry entry = (FeatureMap.Entry) entries.next();
+		for (Iterator<FeatureMap.Entry> entries = featureMap.iterator(); entries
+			.hasNext();) {
+			FeatureMap.Entry entry = entries.next();
 
 			if (name.equals(entry.getEStructuralFeature().getName())) {
 
@@ -223,12 +224,12 @@
 
 		if (internalEObject != null && internalEObject.eIsProxy()) {
 			URI eProxyURI = internalEObject.eProxyURI();
-			URI uri = (URI) UML22UMLExtendedMetaData.getURIMap().get(
+			URI uri = UML22UMLExtendedMetaData.getURIMap().get(
 				eProxyURI.trimFragment());
 
 			if (uri != null) {
-				String fragment = (String) UML22UMLExtendedMetaData
-					.getFragmentMap().get(eProxyURI.fragment());
+				String fragment = UML22UMLExtendedMetaData.getFragmentMap()
+					.get(eProxyURI.fragment());
 
 				if (fragment != null) {
 					internalEObject.eSetProxyURI(uri.appendFragment(fragment));
@@ -251,22 +252,19 @@
 				resource.setID(newEObject, resource.getID(eObject));
 			}
 
-			for (Iterator eAllStructuralFeatures = eObject.eClass()
-				.getEAllStructuralFeatures().iterator(); eAllStructuralFeatures
-				.hasNext();) {
-
-				EStructuralFeature.Internal eStructuralFeature = (EStructuralFeature.Internal) eAllStructuralFeatures
-					.next();
+			for (EStructuralFeature eStructuralFeature : eObject.eClass()
+				.getEAllStructuralFeatures()) {
 
 				if (eStructuralFeature.isChangeable()
-					&& eStructuralFeature.getEOpposite() == null
+					&& ((EStructuralFeature.Internal) eStructuralFeature)
+						.getEOpposite() == null
 					&& eObject.eIsSet(eStructuralFeature)) {
 
 					try {
 						newEObject.eSet(
 							eClass.getEStructuralFeature(eStructuralFeature
 								.getName()), eStructuralFeature.isMany()
-								? ((InternalEList) eObject
+								? ((InternalEList<?>) eObject
 									.eGet(eStructuralFeature)).basicList()
 								: eObject.eGet(eStructuralFeature));
 					} catch (Exception e) {
@@ -275,12 +273,10 @@
 				}
 			}
 
-			for (Iterator inverseReferences = UML2Util.getInverseReferences(
-				eObject).iterator(); inverseReferences.hasNext();) {
+			for (EStructuralFeature.Setting inverseReference : UML2Util
+				.getInverseReferences(eObject)) {
 
-				EStructuralFeature.Setting setting = (EStructuralFeature.Setting) inverseReferences
-					.next();
-				EStructuralFeature eStructuralFeature = setting
+				EStructuralFeature eStructuralFeature = inverseReference
 					.getEStructuralFeature();
 
 				if (eStructuralFeature.isChangeable()) {
@@ -288,10 +284,12 @@
 					try {
 
 						if (eStructuralFeature.isMany()) {
-							List values = (List) setting.get(false);
+							@SuppressWarnings("unchecked")
+							List<EObject> values = (List<EObject>) inverseReference
+								.get(false);
 							values.set(values.indexOf(eObject), newEObject);
 						} else {
-							setting.set(newEObject);
+							inverseReference.set(newEObject);
 						}
 					} catch (Exception e) {
 						UMLPlugin.INSTANCE.log(e);
@@ -314,7 +312,7 @@
 			ResourceSet resourceSet = eResource.getResourceSet();
 
 			if (resourceSet != null) {
-				return (Profile) UML2Util.load(resourceSet, URI
+				return UML2Util.load(resourceSet, URI
 					.createURI(UML22UMLResource.UML2_PROFILE_URI),
 					UMLPackage.Literals.PROFILE);
 			}
@@ -331,21 +329,23 @@
 			: null;
 	}
 
+	@Override
 	public void postLoad(final XMLResource resource, InputStream inputStream,
-			Map options) {
-		final EList resourceContents = resource.getContents();
+			Map<?, ?> options) {
+		final EList<EObject> resourceContents = resource.getContents();
 
-		final List annotationsToRemove = new ArrayList();
+		final List<EAnnotation> annotationsToRemove = new ArrayList<EAnnotation>();
 
-		final Map destructionEvents = new HashMap();
-		final Map executionEvents = new HashMap();
-		final Map sendEvents = new HashMap();
-		final Map receiveEvents = new HashMap();
+		final Map<org.eclipse.uml2.uml.Package, DestructionEvent> destructionEvents = new HashMap<org.eclipse.uml2.uml.Package, DestructionEvent>();
+		final Map<org.eclipse.uml2.uml.Package, ExecutionEvent> executionEvents = new HashMap<org.eclipse.uml2.uml.Package, ExecutionEvent>();
+		final Map<org.eclipse.uml2.uml.Package, Map<NamedElement, MessageEvent>> sendEvents = new HashMap<org.eclipse.uml2.uml.Package, Map<NamedElement, MessageEvent>>();
+		final Map<org.eclipse.uml2.uml.Package, Map<NamedElement, MessageEvent>> receiveEvents = new HashMap<org.eclipse.uml2.uml.Package, Map<NamedElement, MessageEvent>>();
 
-		final List packagesRequiringStereotypes = new ArrayList();
+		final List<org.eclipse.uml2.uml.Package> packagesRequiringStereotypes = new ArrayList<org.eclipse.uml2.uml.Package>();
 
-		UMLSwitch umlSwitch = new UMLSwitch() {
+		UMLSwitch<Object> umlSwitch = new UMLSwitch<Object>() {
 
+			@Override
 			public Object caseAction(Action action) {
 				AnyType extension = getExtension(resource, action);
 
@@ -363,6 +363,7 @@
 				return super.caseAction(action);
 			}
 
+			@Override
 			public Object caseActivity(Activity activity) {
 				AnyType extension = getExtension(resource, activity);
 
@@ -392,36 +393,33 @@
 				return super.caseActivity(activity);
 			}
 
+			@Override
 			public Object caseBehavioralFeature(
 					BehavioralFeature behavioralFeature) {
 				AnyType extension = getExtension(resource, behavioralFeature);
 
 				if (extension != null) {
-					EList ownedParameters = behavioralFeature
+					EList<Parameter> ownedParameters = behavioralFeature
 						.getOwnedParameters();
+					List<Object> returnResult = new ArrayList<Object>(
+						getValues(extension.getMixed(), "returnResult", true)); //$NON-NLS-1$
 
-					List returnResult = Arrays.asList(getValues(
-						extension.getMixed(), "returnResult", true).toArray()); //$NON-NLS-1$
-
-					for (ListIterator values = returnResult
+					for (ListIterator<Object> values = returnResult
 						.listIterator(returnResult.size()); values
 						.hasPrevious();) {
 
 						Object value = values.previous();
 
 						if (value instanceof Parameter) {
-							ownedParameters.add(0, value);
+							ownedParameters.add(0, (Parameter) value);
 						}
 					}
 
-					for (Iterator values = getValues(extension.getMixed(),
-						"formalParameter", true) //$NON-NLS-1$
-						.iterator(); values.hasNext();) {
-
-						Object value = values.next();
+					for (Object value : getValues(extension.getMixed(),
+						"formalParameter", true)) { //$NON-NLS-1$
 
 						if (value instanceof Parameter) {
-							ownedParameters.add(value);
+							ownedParameters.add((Parameter) value);
 						}
 					}
 				}
@@ -429,22 +427,20 @@
 				return super.caseBehavioralFeature(behavioralFeature);
 			}
 
+			@Override
 			public Object caseBehavioredClassifier(
 					BehavioredClassifier behavioredClassifier) {
 				AnyType extension = getExtension(resource, behavioredClassifier);
 
 				if (extension != null) {
-					EList ownedBehaviors = behavioredClassifier
+					EList<Behavior> ownedBehaviors = behavioredClassifier
 						.getOwnedBehaviors();
 
-					for (Iterator values = getValues(extension.getMixed(),
-						"ownedStateMachine", true) //$NON-NLS-1$
-						.iterator(); values.hasNext();) {
-
-						Object value = values.next();
+					for (Object value : getValues(extension.getMixed(),
+						"ownedStateMachine", true)) { //$NON-NLS-1$
 
 						if (value instanceof StateMachine) {
-							ownedBehaviors.add(value);
+							ownedBehaviors.add((StateMachine) value);
 						}
 					}
 				}
@@ -452,6 +448,7 @@
 				return super.caseBehavioredClassifier(behavioredClassifier);
 			}
 
+			@Override
 			public Object caseCallBehaviorAction(
 					CallBehaviorAction callBehaviorAction) {
 				AnyType extension = getExtension(resource, callBehaviorAction);
@@ -473,6 +470,7 @@
 				return super.caseCallBehaviorAction(callBehaviorAction);
 			}
 
+			@Override
 			public Object caseComment(Comment comment) {
 				AnyType extension = getExtension(resource, comment);
 
@@ -497,6 +495,7 @@
 				return super.caseComment(comment);
 			}
 
+			@Override
 			public Object caseDuration(Duration duration) {
 				AnyType extension = getExtension(resource, duration);
 
@@ -505,8 +504,8 @@
 						.equals(getValue(extension.getAnyAttribute(),
 							"isFirstTime"))); //$NON-NLS-1$
 
-					Collection values = getValues(extension.getAnyAttribute(),
-						"event", true); //$NON-NLS-1$
+					Collection<Object> values = getValues(extension
+						.getAnyAttribute(), "event", true); //$NON-NLS-1$
 
 					if (!values.isEmpty()) {
 						DurationObservation durationObservation = (DurationObservation) duration
@@ -514,19 +513,19 @@
 								duration.getName(),
 								UMLPackage.Literals.DURATION_OBSERVATION);
 
-						EList events = durationObservation.getEvents();
-						EList firstEvents = durationObservation
+						EList<NamedElement> events = durationObservation
+							.getEvents();
+						EList<Boolean> firstEvents = durationObservation
 							.getFirstEvents();
 
-						for (Iterator v = values.iterator(); v.hasNext();) {
-							Object value = v.next();
+						for (Object value : values) {
 
 							if (value instanceof String) {
 								EObject eObject = resource
 									.getEObject((String) value);
 
 								if (eObject instanceof NamedElement) {
-									events.add(eObject);
+									events.add((NamedElement) eObject);
 									firstEvents.add(isFirstEvent);
 								}
 							}
@@ -539,6 +538,7 @@
 				return super.caseDuration(duration);
 			}
 
+			@Override
 			public Object caseElement(Element element) {
 				EAnnotation keywordsAnnotation = element
 					.getEAnnotation("keywords"); //$NON-NLS-1$
@@ -553,7 +553,8 @@
 				if (appliedStereotypesAnnotation != null) {
 					annotationsToRemove.add(appliedStereotypesAnnotation);
 
-					EList contents = appliedStereotypesAnnotation.getContents();
+					EList<EObject> contents = appliedStereotypesAnnotation
+						.getContents();
 
 					for (int i = contents.size(); i > 0;) {
 						InternalEObject stereotypeApplication = (InternalEObject) contents
@@ -568,13 +569,14 @@
 				return super.caseElement(element);
 			}
 
+			@Override
 			public Object caseExecutionOccurrenceSpecification(
 					ExecutionOccurrenceSpecification executionOccurrenceSpecification) {
 				org.eclipse.uml2.uml.Package nearestPackage = executionOccurrenceSpecification
 					.getNearestPackage();
 
 				if (nearestPackage != null) {
-					ExecutionEvent executionEvent = (ExecutionEvent) executionEvents
+					ExecutionEvent executionEvent = executionEvents
 						.get(nearestPackage);
 
 					if (executionEvent == null) {
@@ -592,6 +594,7 @@
 				return executionOccurrenceSpecification;
 			}
 
+			@Override
 			public Object caseExpression(Expression expression) {
 				AnyType extension = getExtension(resource, expression);
 
@@ -641,6 +644,7 @@
 				return super.caseExpression(expression);
 			}
 
+			@Override
 			public Object caseExtensionEnd(ExtensionEnd extensionEnd) {
 				String name = extensionEnd.getName();
 
@@ -662,6 +666,7 @@
 				return super.caseExtensionEnd(extensionEnd);
 			}
 
+			@Override
 			public Object caseInteractionUse(InteractionUse interactionUse) {
 				AnyType extension = getExtension(resource, interactionUse);
 
@@ -670,16 +675,18 @@
 						"argument", true); //$NON-NLS-1$
 
 					if (value instanceof InputPin) {
+						InputPin inputValue = (InputPin) value;
 						((OpaqueAction) interactionUse.createArgument(
-							((InputPin) value).getName(),
+							inputValue.getName(),
 							UMLPackage.Literals.OPAQUE_ACTION))
-							.getInputValues().add(value);
+							.getInputValues().add(inputValue);
 					}
 				}
 
 				return super.caseInteractionUse(interactionUse);
 			}
 
+			@Override
 			public Object caseMultiplicityElement(
 					MultiplicityElement multiplicityElement) {
 				AnyType extension = getExtension(resource, multiplicityElement);
@@ -697,6 +704,7 @@
 				return super.caseMultiplicityElement(multiplicityElement);
 			}
 
+			@Override
 			public Object caseMessage(Message message) {
 				AnyType extension = getExtension(resource, message);
 
@@ -728,6 +736,7 @@
 				return super.caseMessage(message);
 			}
 
+			@Override
 			public Object caseMessageEnd(MessageEnd messageEnd) {
 				AnyType extension = getExtension(resource, messageEnd);
 
@@ -758,6 +767,7 @@
 				return super.caseMessageEnd(messageEnd);
 			}
 
+			@Override
 			public Object caseMessageOccurrenceSpecification(
 					MessageOccurrenceSpecification messageOccurrenceSpecification) {
 				caseMessageEnd(messageOccurrenceSpecification);
@@ -770,7 +780,8 @@
 				Message message = messageOccurrenceSpecification.getMessage();
 
 				if (message == null) {
-					Collection values = Collections.EMPTY_LIST;
+					Collection<Object> values = Collections
+						.<Object> emptyList();
 
 					if (extension != null) {
 						values = getValues(extension.getAnyAttribute(),
@@ -789,8 +800,7 @@
 							resource));
 					} else {
 
-						for (Iterator v = values.iterator(); v.hasNext();) {
-							Object value = v.next();
+						for (Object value : values) {
 
 							if (value instanceof String) {
 								EObject eObject = resource
@@ -841,7 +851,7 @@
 							: null;
 
 						if (message.getSendEvent() == messageOccurrenceSpecification) {
-							Map nearestSendEvents = (Map) sendEvents
+							Map<NamedElement, MessageEvent> nearestSendEvents = sendEvents
 								.get(nearestPackage);
 
 							switch (message.getMessageSort().getValue()) {
@@ -868,7 +878,7 @@
 												sendEvents
 													.put(
 														nearestPackage,
-														nearestSendEvents = new HashMap());
+														nearestSendEvents = new HashMap<NamedElement, MessageEvent>());
 											}
 
 											nearestSendEvents.put(signature,
@@ -901,7 +911,7 @@
 												sendEvents
 													.put(
 														nearestPackage,
-														nearestSendEvents = new HashMap());
+														nearestSendEvents = new HashMap<NamedElement, MessageEvent>());
 											}
 
 											nearestSendEvents.put(signature,
@@ -914,7 +924,7 @@
 									break;
 							}
 						} else if (message.getReceiveEvent() == messageOccurrenceSpecification) {
-							Map nearestReceiveEvents = (Map) receiveEvents
+							Map<NamedElement, MessageEvent> nearestReceiveEvents = receiveEvents
 								.get(nearestPackage);
 
 							switch (message.getMessageSort().getValue()) {
@@ -941,7 +951,7 @@
 												receiveEvents
 													.put(
 														nearestPackage,
-														nearestReceiveEvents = new HashMap());
+														nearestReceiveEvents = new HashMap<NamedElement, MessageEvent>());
 											}
 
 											nearestReceiveEvents.put(signature,
@@ -974,7 +984,7 @@
 												receiveEvents
 													.put(
 														nearestPackage,
-														nearestReceiveEvents = new HashMap());
+														nearestReceiveEvents = new HashMap<NamedElement, MessageEvent>());
 											}
 
 											nearestReceiveEvents.put(signature,
@@ -990,7 +1000,7 @@
 					}
 
 					if (extension != null) {
-						Collection values = getValues(extension
+						Collection<Object> values = getValues(extension
 							.getAnyAttribute(), "startExec", true); //$NON-NLS-1$
 
 						if (values.isEmpty()) {
@@ -998,8 +1008,7 @@
 								"finishExec", true); //$NON-NLS-1$
 						}
 
-						for (Iterator v = values.iterator(); v.hasNext();) {
-							Object value = v.next();
+						for (Object value : values) {
 
 							if (value instanceof String) {
 								EObject eObject = resource
@@ -1041,19 +1050,19 @@
 				return messageOccurrenceSpecification;
 			}
 
+			@Override
 			public Object caseNamespace(Namespace namespace) {
 				AnyType extension = getExtension(resource, namespace);
 
 				if (extension != null) {
-					EList packageImports = namespace.getPackageImports();
+					EList<PackageImport> packageImports = namespace
+						.getPackageImports();
 
-					for (Iterator values = getValues(extension.getMixed(),
-						"packageImport", true).iterator(); values.hasNext();) { //$NON-NLS-1$
-
-						Object value = values.next();
+					for (Object value : getValues(extension.getMixed(),
+						"packageImport", true)) { //$NON-NLS-1$
 
 						if (value instanceof PackageImport) {
-							packageImports.add(value);
+							packageImports.add((PackageImport) value);
 						}
 					}
 				}
@@ -1061,6 +1070,7 @@
 				return super.caseNamespace(namespace);
 			}
 
+			@Override
 			public Object caseOccurrenceSpecification(
 					OccurrenceSpecification occurrenceSpecification) {
 
@@ -1069,7 +1079,7 @@
 						.getNearestPackage();
 
 					if (nearestPackage != null) {
-						DestructionEvent destructionEvent = (DestructionEvent) destructionEvents
+						DestructionEvent destructionEvent = destructionEvents
 							.get(nearestPackage);
 
 						if (destructionEvent == null) {
@@ -1091,6 +1101,7 @@
 				return occurrenceSpecification;
 			}
 
+			@Override
 			public Object caseOpaqueAction(OpaqueAction opaqueAction) {
 				AnyType extension = getExtension(resource, opaqueAction);
 
@@ -1125,6 +1136,7 @@
 				return super.caseOpaqueAction(opaqueAction);
 			}
 
+			@Override
 			public Object caseOpaqueExpression(OpaqueExpression opaqueExpression) {
 				AnyType extension = getExtension(resource, opaqueExpression);
 
@@ -1133,13 +1145,13 @@
 						"body", true); //$NON-NLS-1$
 
 					if (value instanceof String) {
-						opaqueExpression.getBodies().add(value);
+						opaqueExpression.getBodies().add((String) value);
 					}
 
 					Stereotype stereotype = getUML2Stereotype(opaqueExpression,
 						STEREOTYPE__EXPRESSION);
 
-					Collection values = getValues(extension.getMixed(),
+					Collection<Object> values = getValues(extension.getMixed(),
 						"operand", true); //$NON-NLS-1$
 
 					if (!values.isEmpty()) {
@@ -1147,14 +1159,17 @@
 						if (UMLUtil.safeApplyStereotype(opaqueExpression,
 							stereotype) != null) {
 
-							EList operands = (EList) opaqueExpression.getValue(
-								stereotype, TAG_DEFINITION__OPERAND);
+							@SuppressWarnings("unchecked")
+							EList<ValueSpecification> operands = (EList<ValueSpecification>) opaqueExpression
+								.getValue(stereotype, TAG_DEFINITION__OPERAND);
 
-							for (Iterator v = values.iterator(); v.hasNext();) {
+							for (Iterator<Object> v = values.iterator(); v
+								.hasNext();) {
+
 								value = v.next();
 
 								if (value instanceof ValueSpecification) {
-									operands.add(value);
+									operands.add((ValueSpecification) value);
 								}
 							}
 						}
@@ -1172,6 +1187,7 @@
 				return super.caseOpaqueExpression(opaqueExpression);
 			}
 
+			@Override
 			public Object caseOperation(Operation operation) {
 				Parameter returnResult = operation.getReturnResult();
 
@@ -1182,6 +1198,7 @@
 				return super.caseOperation(operation);
 			}
 
+			@Override
 			public Object casePackageableElement(
 					PackageableElement packageableElement) {
 				AnyType extension = getExtension(resource, packageableElement);
@@ -1199,6 +1216,7 @@
 				return super.casePackageableElement(packageableElement);
 			}
 
+			@Override
 			public Object caseProfileApplication(
 					ProfileApplication profileApplication) {
 				caseElement(profileApplication);
@@ -1241,8 +1259,9 @@
 				if (attributesAnnotation != null) {
 					attributesAnnotation.setSource(UMLPackage.eNS_URI);
 
-					EMap details = attributesAnnotation.getDetails();
-					String version = (String) details.get("version"); //$NON-NLS-1$
+					EMap<String, String> details = attributesAnnotation
+						.getDetails();
+					String version = details.get("version"); //$NON-NLS-1$
 
 					if (!UML2Util.isEmpty(version)) {
 						Profile appliedProfile = profileApplication
@@ -1258,7 +1277,8 @@
 								.getEAnnotation(UMLPackage.eNS_URI);
 
 							if (eAnnotation != null) {
-								EList contents = eAnnotation.getContents();
+								EList<EObject> contents = eAnnotation
+									.getContents();
 
 								for (int i = contents.size(); i > 0;) {
 									EPackage ePackage = (EPackage) contents
@@ -1297,6 +1317,7 @@
 				return profileApplication;
 			}
 
+			@Override
 			public Object caseProfile(Profile profile) {
 				caseNamespace(profile);
 				casePackageableElement(profile);
@@ -1317,8 +1338,9 @@
 				if (ePackagesAnnotation != null) {
 					ePackagesAnnotation.setSource(UMLPackage.eNS_URI);
 
-					new EcoreSwitch() {
+					new EcoreSwitch<Object>() {
 
+						@Override
 						public Object caseEClass(EClass eClass) {
 							EAnnotation stereotypeAnnotation = eClass
 								.getEAnnotation("stereotype"); //$NON-NLS-1$
@@ -1327,7 +1349,7 @@
 								stereotypeAnnotation
 									.setSource(UMLPackage.eNS_URI);
 
-								EList references = stereotypeAnnotation
+								EList<EObject> references = stereotypeAnnotation
 									.getReferences();
 
 								if (!references.isEmpty()) {
@@ -1336,12 +1358,9 @@
 									if (reference instanceof Stereotype) {
 										Stereotype stereotype = (Stereotype) reference;
 
-										for (Iterator ownedAttributes = stereotype
-											.getOwnedAttributes().iterator(); ownedAttributes
-											.hasNext();) {
+										for (Property ownedAttribute : stereotype
+											.getOwnedAttributes()) {
 
-											Property ownedAttribute = (Property) ownedAttributes
-												.next();
 											String name = ownedAttribute
 												.getName();
 
@@ -1380,26 +1399,24 @@
 							return super.caseEClass(eClass);
 						}
 
+						@Override
 						public Object caseEEnum(EEnum eEnum) {
 
-							for (Iterator eLiterals = eEnum.getELiterals()
-								.iterator(); eLiterals.hasNext();) {
-
-								EAnnotation enumerationLiteralAnnotation = ((EEnumLiteral) eLiterals
-									.next())
+							for (EEnumLiteral eLiteral : eEnum.getELiterals()) {
+								EAnnotation enumerationLiteralAnnotation = eLiteral
 									.getEAnnotation("enumerationLiteral"); //$NON-NLS-1$
 
 								if (enumerationLiteralAnnotation != null) {
 									annotationsToRemove
 										.add(enumerationLiteralAnnotation);
 
-									EList eEnumReferences = UML2Util
+									EList<EObject> eEnumReferences = UML2Util
 										.getEAnnotation(eEnum,
 											UMLPackage.eNS_URI, true)
 										.getReferences();
 
 									if (eEnumReferences.isEmpty()) {
-										EList eEnumLiteralReferences = enumerationLiteralAnnotation
+										EList<EObject> eEnumLiteralReferences = enumerationLiteralAnnotation
 											.getReferences();
 
 										if (!eEnumLiteralReferences.isEmpty()) {
@@ -1419,12 +1436,11 @@
 							return super.caseEEnum(eEnum);
 						}
 
+						@Override
 						public Object defaultCase(EObject eObject) {
 
-							for (Iterator eContents = eObject.eContents()
-								.iterator(); eContents.hasNext();) {
-
-								doSwitch((EObject) eContents.next());
+							for (EObject eContent : eObject.eContents()) {
+								doSwitch(eContent);
 							}
 
 							return eObject;
@@ -1435,6 +1451,7 @@
 				return profile;
 			}
 
+			@Override
 			public Object caseProperty(Property property) {
 
 				if (property.eGet(UMLPackage.Literals.PROPERTY__ASSOCIATION,
@@ -1451,6 +1468,7 @@
 				return super.caseProperty(property);
 			}
 
+			@Override
 			public Object caseRealization(Realization realization) {
 				AnyType extension = getExtension(resource, realization);
 
@@ -1462,6 +1480,7 @@
 				return super.caseRealization(realization);
 			}
 
+			@Override
 			public Object caseTemplateParameter(
 					TemplateParameter templateParameter) {
 				AnyType extension = getExtension(resource, templateParameter);
@@ -1536,6 +1555,7 @@
 				return super.caseTemplateParameter(templateParameter);
 			}
 
+			@Override
 			public Object caseTemplateSignature(
 					TemplateSignature templateSignature) {
 				AnyType extension = getExtension(resource, templateSignature);
@@ -1544,27 +1564,28 @@
 					Stereotype stereotype = getUML2Stereotype(
 						templateSignature, STEREOTYPE__TEMPLATE_SIGNATURE);
 
-					Collection values = getValues(extension.getAnyAttribute(),
-						"nestedSignature", true); //$NON-NLS-1$
+					Collection<Object> values = getValues(extension
+						.getAnyAttribute(), "nestedSignature", true); //$NON-NLS-1$
 
 					if (!values.isEmpty()) {
 
 						if (UMLUtil.safeApplyStereotype(templateSignature,
 							stereotype) != null) {
 
-							EList nestedSignatures = (EList) templateSignature
+							@SuppressWarnings("unchecked")
+							EList<TemplateSignature> nestedSignatures = (EList<TemplateSignature>) templateSignature
 								.getValue(stereotype,
 									TAG_DEFINITION__NESTED_SIGNATURE);
 
-							for (Iterator v = values.iterator(); v.hasNext();) {
-								Object value = v.next();
+							for (Object value : values) {
 
 								if (value instanceof String) {
 									EObject eObject = resource
 										.getEObject((String) value);
 
 									if (eObject instanceof TemplateSignature) {
-										nestedSignatures.add(eObject);
+										nestedSignatures
+											.add((TemplateSignature) eObject);
 									}
 								}
 							}
@@ -1588,6 +1609,7 @@
 				return super.caseTemplateSignature(templateSignature);
 			}
 
+			@Override
 			public Object caseTimeExpression(TimeExpression timeExpression) {
 				AnyType extension = getExtension(resource, timeExpression);
 
@@ -1616,11 +1638,12 @@
 				return super.caseTimeExpression(timeExpression);
 			}
 
+			@Override
 			public Object caseTransition(Transition transition) {
 				Constraint guard = transition.getGuard();
 
 				if (guard != null) {
-					EList ownedRules = transition.getOwnedRules();
+					EList<Constraint> ownedRules = transition.getOwnedRules();
 
 					if (!ownedRules.contains(guard)) {
 						ownedRules.add(guard);
@@ -1630,6 +1653,7 @@
 				return super.caseTransition(transition);
 			}
 
+			@Override
 			public Object caseTrigger(Trigger trigger) {
 				Event event = null;
 				AnyType extension = getExtension(resource, trigger);
@@ -1713,6 +1737,7 @@
 				return super.caseTrigger(trigger);
 			}
 
+			@Override
 			public Object defaultCase(EObject eObject) {
 				AnyType extension = getExtension(resource, eObject);
 
@@ -1737,22 +1762,20 @@
 					}
 				}
 
-				for (Iterator eAllReferences = eObject.eClass()
-					.getEAllReferences().iterator(); eAllReferences.hasNext();) {
-
-					EReference eReference = (EReference) eAllReferences.next();
+				for (EReference eReference : eObject.eClass()
+					.getEAllReferences()) {
 
 					if (!eReference.isDerived() && !eReference.isContainer()
 						&& !eReference.isContainment()
 						&& eObject.eIsSet(eReference)) {
 
 						if (eReference.isMany()) {
+							@SuppressWarnings("unchecked")
+							InternalEList<InternalEObject> values = (InternalEList<InternalEObject>) eObject
+								.eGet(eReference);
 
-							for (Iterator values = ((InternalEList) eObject
-								.eGet(eReference)).basicIterator(); values
-								.hasNext();) {
-
-								handleProxy((InternalEObject) values.next());
+							for (InternalEObject value : values) {
+								handleProxy(value);
 							}
 						} else {
 							handleProxy((InternalEObject) eObject.eGet(
@@ -1761,10 +1784,8 @@
 					}
 				}
 
-				for (Iterator eContents = eObject.eContents().iterator(); eContents
-					.hasNext();) {
-
-					doSwitch((EObject) eContents.next());
+				for (EObject eContent : eObject.eContents()) {
+					doSwitch(eContent);
 				}
 
 				return eObject;
@@ -1772,17 +1793,15 @@
 		};
 
 		for (int i = 0; i < resourceContents.size(); i++) {
-			umlSwitch.doSwitch((EObject) resourceContents.get(i));
+			umlSwitch.doSwitch(resourceContents.get(i));
 		}
 
-		for (Iterator atr = annotationsToRemove.iterator(); atr.hasNext();) {
-			((EAnnotation) atr.next()).setEModelElement(null);
+		for (EAnnotation eAnnotation : annotationsToRemove) {
+			eAnnotation.setEModelElement(null);
 		}
 
-		for (Iterator prs = packagesRequiringStereotypes.iterator(); prs
-			.hasNext();) {
-
-			ElementOperations.applyAllRequiredStereotypes((Element) prs.next());
+		for (org.eclipse.uml2.uml.Package package_ : packagesRequiringStereotypes) {
+			ElementOperations.applyAllRequiredStereotypes(package_);
 		}
 	}
 }
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/XMI2UMLExtendedMetaData.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/XMI2UMLExtendedMetaData.java
index 302b9a2..071b2f5 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/XMI2UMLExtendedMetaData.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/resource/XMI2UMLExtendedMetaData.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  * 
- * $Id: XMI2UMLExtendedMetaData.java,v 1.3 2006/10/18 18:30:51 khussey Exp $
+ * $Id: XMI2UMLExtendedMetaData.java,v 1.4 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.resource;
 
@@ -23,12 +23,12 @@
 public class XMI2UMLExtendedMetaData
 		extends BasicExtendedMetaData {
 
-	protected static Map uriMap = null;
+	protected static Map<URI, URI> uriMap = null;
 
-	public static Map getURIMap() {
+	public static Map<URI, URI> getURIMap() {
 
 		if (uriMap == null) {
-			uriMap = new HashMap();
+			uriMap = new HashMap<URI, URI>();
 
 			uriMap.put(URI.createURI(XMI2UMLResource.STANDARD_PROFILE_URI), URI
 				.createURI(UMLResource.STANDARD_PROFILE_URI));
@@ -43,6 +43,7 @@
 		super(registry);
 	}
 
+	@Override
 	public String getNamespace(EPackage ePackage) {
 
 		if (ePackage == UMLPackage.eINSTANCE) {
@@ -55,6 +56,7 @@
 			: namespace;
 	}
 
+	@Override
 	public EPackage getPackage(String namespace) {
 
 		return XMI2UMLResource.UML_METAMODEL_NS_URI.equals(namespace)
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLAdapterFactory.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLAdapterFactory.java
index 2a11fac..b3933b1 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLAdapterFactory.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLAdapterFactory.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLAdapterFactory.java,v 1.8 2006/05/16 15:07:26 khussey Exp $
+ * $Id: UMLAdapterFactory.java,v 1.9 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.util;
 
@@ -305,6 +305,7 @@
 	 * @return whether this factory is applicable for the type of the object.
 	 * @generated
 	 */
+	@Override
 	public boolean isFactoryForType(Object object) {
 		if (object == modelPackage) {
 			return true;
@@ -321,1018 +322,1271 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	protected UMLSwitch modelSwitch = new UMLSwitch() {
+	protected UMLSwitch<Adapter> modelSwitch = new UMLSwitch<Adapter>() {
 
-		public Object caseComment(Comment object) {
+		@Override
+		public Adapter caseComment(Comment object) {
 			return createCommentAdapter();
 		}
 
-		public Object caseElement(Element object) {
+		@Override
+		public Adapter caseElement(Element object) {
 			return createElementAdapter();
 		}
 
-		public Object casePackage(org.eclipse.uml2.uml.Package object) {
+		@Override
+		public Adapter casePackage(org.eclipse.uml2.uml.Package object) {
 			return createPackageAdapter();
 		}
 
-		public Object casePackageableElement(PackageableElement object) {
+		@Override
+		public Adapter casePackageableElement(PackageableElement object) {
 			return createPackageableElementAdapter();
 		}
 
-		public Object caseNamedElement(NamedElement object) {
+		@Override
+		public Adapter caseNamedElement(NamedElement object) {
 			return createNamedElementAdapter();
 		}
 
-		public Object caseDependency(Dependency object) {
+		@Override
+		public Adapter caseDependency(Dependency object) {
 			return createDependencyAdapter();
 		}
 
-		public Object caseDirectedRelationship(DirectedRelationship object) {
+		@Override
+		public Adapter caseDirectedRelationship(DirectedRelationship object) {
 			return createDirectedRelationshipAdapter();
 		}
 
-		public Object caseRelationship(Relationship object) {
+		@Override
+		public Adapter caseRelationship(Relationship object) {
 			return createRelationshipAdapter();
 		}
 
-		public Object caseNamespace(Namespace object) {
+		@Override
+		public Adapter caseNamespace(Namespace object) {
 			return createNamespaceAdapter();
 		}
 
-		public Object caseElementImport(ElementImport object) {
+		@Override
+		public Adapter caseElementImport(ElementImport object) {
 			return createElementImportAdapter();
 		}
 
-		public Object casePackageImport(PackageImport object) {
+		@Override
+		public Adapter casePackageImport(PackageImport object) {
 			return createPackageImportAdapter();
 		}
 
-		public Object caseConstraint(Constraint object) {
+		@Override
+		public Adapter caseConstraint(Constraint object) {
 			return createConstraintAdapter();
 		}
 
-		public Object caseValueSpecification(ValueSpecification object) {
+		@Override
+		public Adapter caseValueSpecification(ValueSpecification object) {
 			return createValueSpecificationAdapter();
 		}
 
-		public Object caseTypedElement(TypedElement object) {
+		@Override
+		public Adapter caseTypedElement(TypedElement object) {
 			return createTypedElementAdapter();
 		}
 
-		public Object caseType(Type object) {
+		@Override
+		public Adapter caseType(Type object) {
 			return createTypeAdapter();
 		}
 
-		public Object caseAssociation(Association object) {
+		@Override
+		public Adapter caseAssociation(Association object) {
 			return createAssociationAdapter();
 		}
 
-		public Object caseClassifier(Classifier object) {
+		@Override
+		public Adapter caseClassifier(Classifier object) {
 			return createClassifierAdapter();
 		}
 
-		public Object caseRedefinableElement(RedefinableElement object) {
+		@Override
+		public Adapter caseRedefinableElement(RedefinableElement object) {
 			return createRedefinableElementAdapter();
 		}
 
-		public Object caseTemplateableElement(TemplateableElement object) {
+		@Override
+		public Adapter caseTemplateableElement(TemplateableElement object) {
 			return createTemplateableElementAdapter();
 		}
 
-		public Object caseTemplateBinding(TemplateBinding object) {
+		@Override
+		public Adapter caseTemplateBinding(TemplateBinding object) {
 			return createTemplateBindingAdapter();
 		}
 
-		public Object caseTemplateSignature(TemplateSignature object) {
+		@Override
+		public Adapter caseTemplateSignature(TemplateSignature object) {
 			return createTemplateSignatureAdapter();
 		}
 
-		public Object caseTemplateParameter(TemplateParameter object) {
+		@Override
+		public Adapter caseTemplateParameter(TemplateParameter object) {
 			return createTemplateParameterAdapter();
 		}
 
-		public Object caseParameterableElement(ParameterableElement object) {
+		@Override
+		public Adapter caseParameterableElement(ParameterableElement object) {
 			return createParameterableElementAdapter();
 		}
 
-		public Object caseTemplateParameterSubstitution(
+		@Override
+		public Adapter caseTemplateParameterSubstitution(
 				TemplateParameterSubstitution object) {
 			return createTemplateParameterSubstitutionAdapter();
 		}
 
-		public Object caseGeneralization(Generalization object) {
+		@Override
+		public Adapter caseGeneralization(Generalization object) {
 			return createGeneralizationAdapter();
 		}
 
-		public Object caseGeneralizationSet(GeneralizationSet object) {
+		@Override
+		public Adapter caseGeneralizationSet(GeneralizationSet object) {
 			return createGeneralizationSetAdapter();
 		}
 
-		public Object caseFeature(Feature object) {
+		@Override
+		public Adapter caseFeature(Feature object) {
 			return createFeatureAdapter();
 		}
 
-		public Object caseSubstitution(Substitution object) {
+		@Override
+		public Adapter caseSubstitution(Substitution object) {
 			return createSubstitutionAdapter();
 		}
 
-		public Object caseRealization(Realization object) {
+		@Override
+		public Adapter caseRealization(Realization object) {
 			return createRealizationAdapter();
 		}
 
-		public Object caseAbstraction(Abstraction object) {
+		@Override
+		public Adapter caseAbstraction(Abstraction object) {
 			return createAbstractionAdapter();
 		}
 
-		public Object caseOpaqueExpression(OpaqueExpression object) {
+		@Override
+		public Adapter caseOpaqueExpression(OpaqueExpression object) {
 			return createOpaqueExpressionAdapter();
 		}
 
-		public Object caseParameter(Parameter object) {
+		@Override
+		public Adapter caseParameter(Parameter object) {
 			return createParameterAdapter();
 		}
 
-		public Object caseMultiplicityElement(MultiplicityElement object) {
+		@Override
+		public Adapter caseMultiplicityElement(MultiplicityElement object) {
 			return createMultiplicityElementAdapter();
 		}
 
-		public Object caseConnectableElement(ConnectableElement object) {
+		@Override
+		public Adapter caseConnectableElement(ConnectableElement object) {
 			return createConnectableElementAdapter();
 		}
 
-		public Object caseConnectorEnd(ConnectorEnd object) {
+		@Override
+		public Adapter caseConnectorEnd(ConnectorEnd object) {
 			return createConnectorEndAdapter();
 		}
 
-		public Object caseProperty(Property object) {
+		@Override
+		public Adapter caseProperty(Property object) {
 			return createPropertyAdapter();
 		}
 
-		public Object caseDeploymentTarget(DeploymentTarget object) {
+		@Override
+		public Adapter caseDeploymentTarget(DeploymentTarget object) {
 			return createDeploymentTargetAdapter();
 		}
 
-		public Object caseDeployment(Deployment object) {
+		@Override
+		public Adapter caseDeployment(Deployment object) {
 			return createDeploymentAdapter();
 		}
 
-		public Object caseDeployedArtifact(DeployedArtifact object) {
+		@Override
+		public Adapter caseDeployedArtifact(DeployedArtifact object) {
 			return createDeployedArtifactAdapter();
 		}
 
-		public Object caseDeploymentSpecification(DeploymentSpecification object) {
+		@Override
+		public Adapter caseDeploymentSpecification(
+				DeploymentSpecification object) {
 			return createDeploymentSpecificationAdapter();
 		}
 
-		public Object caseArtifact(Artifact object) {
+		@Override
+		public Adapter caseArtifact(Artifact object) {
 			return createArtifactAdapter();
 		}
 
-		public Object caseManifestation(Manifestation object) {
+		@Override
+		public Adapter caseManifestation(Manifestation object) {
 			return createManifestationAdapter();
 		}
 
-		public Object caseOperation(Operation object) {
+		@Override
+		public Adapter caseOperation(Operation object) {
 			return createOperationAdapter();
 		}
 
-		public Object caseBehavioralFeature(BehavioralFeature object) {
+		@Override
+		public Adapter caseBehavioralFeature(BehavioralFeature object) {
 			return createBehavioralFeatureAdapter();
 		}
 
-		public Object caseBehavior(Behavior object) {
+		@Override
+		public Adapter caseBehavior(Behavior object) {
 			return createBehaviorAdapter();
 		}
 
-		public Object caseClass(org.eclipse.uml2.uml.Class object) {
+		@Override
+		public Adapter caseClass(org.eclipse.uml2.uml.Class object) {
 			return createClassAdapter();
 		}
 
-		public Object caseBehavioredClassifier(BehavioredClassifier object) {
+		@Override
+		public Adapter caseBehavioredClassifier(BehavioredClassifier object) {
 			return createBehavioredClassifierAdapter();
 		}
 
-		public Object caseInterfaceRealization(InterfaceRealization object) {
+		@Override
+		public Adapter caseInterfaceRealization(InterfaceRealization object) {
 			return createInterfaceRealizationAdapter();
 		}
 
-		public Object caseInterface(Interface object) {
+		@Override
+		public Adapter caseInterface(Interface object) {
 			return createInterfaceAdapter();
 		}
 
-		public Object caseReception(Reception object) {
+		@Override
+		public Adapter caseReception(Reception object) {
 			return createReceptionAdapter();
 		}
 
-		public Object caseSignal(Signal object) {
+		@Override
+		public Adapter caseSignal(Signal object) {
 			return createSignalAdapter();
 		}
 
-		public Object caseProtocolStateMachine(ProtocolStateMachine object) {
+		@Override
+		public Adapter caseProtocolStateMachine(ProtocolStateMachine object) {
 			return createProtocolStateMachineAdapter();
 		}
 
-		public Object caseStateMachine(StateMachine object) {
+		@Override
+		public Adapter caseStateMachine(StateMachine object) {
 			return createStateMachineAdapter();
 		}
 
-		public Object caseRegion(Region object) {
+		@Override
+		public Adapter caseRegion(Region object) {
 			return createRegionAdapter();
 		}
 
-		public Object caseVertex(Vertex object) {
+		@Override
+		public Adapter caseVertex(Vertex object) {
 			return createVertexAdapter();
 		}
 
-		public Object caseTransition(Transition object) {
+		@Override
+		public Adapter caseTransition(Transition object) {
 			return createTransitionAdapter();
 		}
 
-		public Object caseTrigger(Trigger object) {
+		@Override
+		public Adapter caseTrigger(Trigger object) {
 			return createTriggerAdapter();
 		}
 
-		public Object caseEvent(Event object) {
+		@Override
+		public Adapter caseEvent(Event object) {
 			return createEventAdapter();
 		}
 
-		public Object casePort(Port object) {
+		@Override
+		public Adapter casePort(Port object) {
 			return createPortAdapter();
 		}
 
-		public Object caseState(State object) {
+		@Override
+		public Adapter caseState(State object) {
 			return createStateAdapter();
 		}
 
-		public Object caseConnectionPointReference(
+		@Override
+		public Adapter caseConnectionPointReference(
 				ConnectionPointReference object) {
 			return createConnectionPointReferenceAdapter();
 		}
 
-		public Object casePseudostate(Pseudostate object) {
+		@Override
+		public Adapter casePseudostate(Pseudostate object) {
 			return createPseudostateAdapter();
 		}
 
-		public Object caseProtocolConformance(ProtocolConformance object) {
+		@Override
+		public Adapter caseProtocolConformance(ProtocolConformance object) {
 			return createProtocolConformanceAdapter();
 		}
 
-		public Object caseEncapsulatedClassifier(EncapsulatedClassifier object) {
+		@Override
+		public Adapter caseEncapsulatedClassifier(EncapsulatedClassifier object) {
 			return createEncapsulatedClassifierAdapter();
 		}
 
-		public Object caseStructuredClassifier(StructuredClassifier object) {
+		@Override
+		public Adapter caseStructuredClassifier(StructuredClassifier object) {
 			return createStructuredClassifierAdapter();
 		}
 
-		public Object caseConnector(Connector object) {
+		@Override
+		public Adapter caseConnector(Connector object) {
 			return createConnectorAdapter();
 		}
 
-		public Object caseExtension(Extension object) {
+		@Override
+		public Adapter caseExtension(Extension object) {
 			return createExtensionAdapter();
 		}
 
-		public Object caseExtensionEnd(ExtensionEnd object) {
+		@Override
+		public Adapter caseExtensionEnd(ExtensionEnd object) {
 			return createExtensionEndAdapter();
 		}
 
-		public Object caseStereotype(Stereotype object) {
+		@Override
+		public Adapter caseStereotype(Stereotype object) {
 			return createStereotypeAdapter();
 		}
 
-		public Object caseImage(Image object) {
+		@Override
+		public Adapter caseImage(Image object) {
 			return createImageAdapter();
 		}
 
-		public Object caseProfile(Profile object) {
+		@Override
+		public Adapter caseProfile(Profile object) {
 			return createProfileAdapter();
 		}
 
-		public Object caseModel(Model object) {
+		@Override
+		public Adapter caseModel(Model object) {
 			return createModelAdapter();
 		}
 
-		public Object caseParameterSet(ParameterSet object) {
+		@Override
+		public Adapter caseParameterSet(ParameterSet object) {
 			return createParameterSetAdapter();
 		}
 
-		public Object caseDataType(DataType object) {
+		@Override
+		public Adapter caseDataType(DataType object) {
 			return createDataTypeAdapter();
 		}
 
-		public Object caseOperationTemplateParameter(
+		@Override
+		public Adapter caseOperationTemplateParameter(
 				OperationTemplateParameter object) {
 			return createOperationTemplateParameterAdapter();
 		}
 
-		public Object caseStructuralFeature(StructuralFeature object) {
+		@Override
+		public Adapter caseStructuralFeature(StructuralFeature object) {
 			return createStructuralFeatureAdapter();
 		}
 
-		public Object caseConnectableElementTemplateParameter(
+		@Override
+		public Adapter caseConnectableElementTemplateParameter(
 				ConnectableElementTemplateParameter object) {
 			return createConnectableElementTemplateParameterAdapter();
 		}
 
-		public Object caseCollaborationUse(CollaborationUse object) {
+		@Override
+		public Adapter caseCollaborationUse(CollaborationUse object) {
 			return createCollaborationUseAdapter();
 		}
 
-		public Object caseCollaboration(Collaboration object) {
+		@Override
+		public Adapter caseCollaboration(Collaboration object) {
 			return createCollaborationAdapter();
 		}
 
-		public Object caseUseCase(UseCase object) {
+		@Override
+		public Adapter caseUseCase(UseCase object) {
 			return createUseCaseAdapter();
 		}
 
-		public Object caseInclude(Include object) {
+		@Override
+		public Adapter caseInclude(Include object) {
 			return createIncludeAdapter();
 		}
 
-		public Object caseExtend(Extend object) {
+		@Override
+		public Adapter caseExtend(Extend object) {
 			return createExtendAdapter();
 		}
 
-		public Object caseExtensionPoint(ExtensionPoint object) {
+		@Override
+		public Adapter caseExtensionPoint(ExtensionPoint object) {
 			return createExtensionPointAdapter();
 		}
 
-		public Object caseRedefinableTemplateSignature(
+		@Override
+		public Adapter caseRedefinableTemplateSignature(
 				RedefinableTemplateSignature object) {
 			return createRedefinableTemplateSignatureAdapter();
 		}
 
-		public Object caseClassifierTemplateParameter(
+		@Override
+		public Adapter caseClassifierTemplateParameter(
 				ClassifierTemplateParameter object) {
 			return createClassifierTemplateParameterAdapter();
 		}
 
-		public Object caseStringExpression(StringExpression object) {
+		@Override
+		public Adapter caseStringExpression(StringExpression object) {
 			return createStringExpressionAdapter();
 		}
 
-		public Object caseExpression(Expression object) {
+		@Override
+		public Adapter caseExpression(Expression object) {
 			return createExpressionAdapter();
 		}
 
-		public Object casePackageMerge(PackageMerge object) {
+		@Override
+		public Adapter casePackageMerge(PackageMerge object) {
 			return createPackageMergeAdapter();
 		}
 
-		public Object caseProfileApplication(ProfileApplication object) {
+		@Override
+		public Adapter caseProfileApplication(ProfileApplication object) {
 			return createProfileApplicationAdapter();
 		}
 
-		public Object caseEnumeration(Enumeration object) {
+		@Override
+		public Adapter caseEnumeration(Enumeration object) {
 			return createEnumerationAdapter();
 		}
 
-		public Object caseEnumerationLiteral(EnumerationLiteral object) {
+		@Override
+		public Adapter caseEnumerationLiteral(EnumerationLiteral object) {
 			return createEnumerationLiteralAdapter();
 		}
 
-		public Object caseInstanceSpecification(InstanceSpecification object) {
+		@Override
+		public Adapter caseInstanceSpecification(InstanceSpecification object) {
 			return createInstanceSpecificationAdapter();
 		}
 
-		public Object caseSlot(Slot object) {
+		@Override
+		public Adapter caseSlot(Slot object) {
 			return createSlotAdapter();
 		}
 
-		public Object casePrimitiveType(PrimitiveType object) {
+		@Override
+		public Adapter casePrimitiveType(PrimitiveType object) {
 			return createPrimitiveTypeAdapter();
 		}
 
-		public Object caseLiteralSpecification(LiteralSpecification object) {
+		@Override
+		public Adapter caseLiteralSpecification(LiteralSpecification object) {
 			return createLiteralSpecificationAdapter();
 		}
 
-		public Object caseLiteralInteger(LiteralInteger object) {
+		@Override
+		public Adapter caseLiteralInteger(LiteralInteger object) {
 			return createLiteralIntegerAdapter();
 		}
 
-		public Object caseLiteralString(LiteralString object) {
+		@Override
+		public Adapter caseLiteralString(LiteralString object) {
 			return createLiteralStringAdapter();
 		}
 
-		public Object caseLiteralBoolean(LiteralBoolean object) {
+		@Override
+		public Adapter caseLiteralBoolean(LiteralBoolean object) {
 			return createLiteralBooleanAdapter();
 		}
 
-		public Object caseLiteralNull(LiteralNull object) {
+		@Override
+		public Adapter caseLiteralNull(LiteralNull object) {
 			return createLiteralNullAdapter();
 		}
 
-		public Object caseInstanceValue(InstanceValue object) {
+		@Override
+		public Adapter caseInstanceValue(InstanceValue object) {
 			return createInstanceValueAdapter();
 		}
 
-		public Object caseLiteralUnlimitedNatural(LiteralUnlimitedNatural object) {
+		@Override
+		public Adapter caseLiteralUnlimitedNatural(
+				LiteralUnlimitedNatural object) {
 			return createLiteralUnlimitedNaturalAdapter();
 		}
 
-		public Object caseOpaqueBehavior(OpaqueBehavior object) {
+		@Override
+		public Adapter caseOpaqueBehavior(OpaqueBehavior object) {
 			return createOpaqueBehaviorAdapter();
 		}
 
-		public Object caseFunctionBehavior(FunctionBehavior object) {
+		@Override
+		public Adapter caseFunctionBehavior(FunctionBehavior object) {
 			return createFunctionBehaviorAdapter();
 		}
 
-		public Object caseOpaqueAction(OpaqueAction object) {
+		@Override
+		public Adapter caseOpaqueAction(OpaqueAction object) {
 			return createOpaqueActionAdapter();
 		}
 
-		public Object caseAction(Action object) {
+		@Override
+		public Adapter caseAction(Action object) {
 			return createActionAdapter();
 		}
 
-		public Object caseExecutableNode(ExecutableNode object) {
+		@Override
+		public Adapter caseExecutableNode(ExecutableNode object) {
 			return createExecutableNodeAdapter();
 		}
 
-		public Object caseActivityNode(ActivityNode object) {
+		@Override
+		public Adapter caseActivityNode(ActivityNode object) {
 			return createActivityNodeAdapter();
 		}
 
-		public Object caseStructuredActivityNode(StructuredActivityNode object) {
+		@Override
+		public Adapter caseStructuredActivityNode(StructuredActivityNode object) {
 			return createStructuredActivityNodeAdapter();
 		}
 
-		public Object caseActivityGroup(ActivityGroup object) {
+		@Override
+		public Adapter caseActivityGroup(ActivityGroup object) {
 			return createActivityGroupAdapter();
 		}
 
-		public Object caseActivity(Activity object) {
+		@Override
+		public Adapter caseActivity(Activity object) {
 			return createActivityAdapter();
 		}
 
-		public Object caseVariable(Variable object) {
+		@Override
+		public Adapter caseVariable(Variable object) {
 			return createVariableAdapter();
 		}
 
-		public Object caseActivityEdge(ActivityEdge object) {
+		@Override
+		public Adapter caseActivityEdge(ActivityEdge object) {
 			return createActivityEdgeAdapter();
 		}
 
-		public Object caseActivityPartition(ActivityPartition object) {
+		@Override
+		public Adapter caseActivityPartition(ActivityPartition object) {
 			return createActivityPartitionAdapter();
 		}
 
-		public Object caseInterruptibleActivityRegion(
+		@Override
+		public Adapter caseInterruptibleActivityRegion(
 				InterruptibleActivityRegion object) {
 			return createInterruptibleActivityRegionAdapter();
 		}
 
-		public Object caseExceptionHandler(ExceptionHandler object) {
+		@Override
+		public Adapter caseExceptionHandler(ExceptionHandler object) {
 			return createExceptionHandlerAdapter();
 		}
 
-		public Object caseObjectNode(ObjectNode object) {
+		@Override
+		public Adapter caseObjectNode(ObjectNode object) {
 			return createObjectNodeAdapter();
 		}
 
-		public Object caseOutputPin(OutputPin object) {
+		@Override
+		public Adapter caseOutputPin(OutputPin object) {
 			return createOutputPinAdapter();
 		}
 
-		public Object casePin(Pin object) {
+		@Override
+		public Adapter casePin(Pin object) {
 			return createPinAdapter();
 		}
 
-		public Object caseInputPin(InputPin object) {
+		@Override
+		public Adapter caseInputPin(InputPin object) {
 			return createInputPinAdapter();
 		}
 
-		public Object caseCallAction(CallAction object) {
+		@Override
+		public Adapter caseCallAction(CallAction object) {
 			return createCallActionAdapter();
 		}
 
-		public Object caseInvocationAction(InvocationAction object) {
+		@Override
+		public Adapter caseInvocationAction(InvocationAction object) {
 			return createInvocationActionAdapter();
 		}
 
-		public Object caseSendSignalAction(SendSignalAction object) {
+		@Override
+		public Adapter caseSendSignalAction(SendSignalAction object) {
 			return createSendSignalActionAdapter();
 		}
 
-		public Object caseCallOperationAction(CallOperationAction object) {
+		@Override
+		public Adapter caseCallOperationAction(CallOperationAction object) {
 			return createCallOperationActionAdapter();
 		}
 
-		public Object caseCallBehaviorAction(CallBehaviorAction object) {
+		@Override
+		public Adapter caseCallBehaviorAction(CallBehaviorAction object) {
 			return createCallBehaviorActionAdapter();
 		}
 
-		public Object caseSequenceNode(SequenceNode object) {
+		@Override
+		public Adapter caseSequenceNode(SequenceNode object) {
 			return createSequenceNodeAdapter();
 		}
 
-		public Object caseUsage(Usage object) {
+		@Override
+		public Adapter caseUsage(Usage object) {
 			return createUsageAdapter();
 		}
 
-		public Object caseControlNode(ControlNode object) {
+		@Override
+		public Adapter caseControlNode(ControlNode object) {
 			return createControlNodeAdapter();
 		}
 
-		public Object caseControlFlow(ControlFlow object) {
+		@Override
+		public Adapter caseControlFlow(ControlFlow object) {
 			return createControlFlowAdapter();
 		}
 
-		public Object caseInitialNode(InitialNode object) {
+		@Override
+		public Adapter caseInitialNode(InitialNode object) {
 			return createInitialNodeAdapter();
 		}
 
-		public Object caseActivityParameterNode(ActivityParameterNode object) {
+		@Override
+		public Adapter caseActivityParameterNode(ActivityParameterNode object) {
 			return createActivityParameterNodeAdapter();
 		}
 
-		public Object caseValuePin(ValuePin object) {
+		@Override
+		public Adapter caseValuePin(ValuePin object) {
 			return createValuePinAdapter();
 		}
 
-		public Object caseMessage(Message object) {
+		@Override
+		public Adapter caseMessage(Message object) {
 			return createMessageAdapter();
 		}
 
-		public Object caseMessageEnd(MessageEnd object) {
+		@Override
+		public Adapter caseMessageEnd(MessageEnd object) {
 			return createMessageEndAdapter();
 		}
 
-		public Object caseInteraction(Interaction object) {
+		@Override
+		public Adapter caseInteraction(Interaction object) {
 			return createInteractionAdapter();
 		}
 
-		public Object caseInteractionFragment(InteractionFragment object) {
+		@Override
+		public Adapter caseInteractionFragment(InteractionFragment object) {
 			return createInteractionFragmentAdapter();
 		}
 
-		public Object caseLifeline(Lifeline object) {
+		@Override
+		public Adapter caseLifeline(Lifeline object) {
 			return createLifelineAdapter();
 		}
 
-		public Object casePartDecomposition(PartDecomposition object) {
+		@Override
+		public Adapter casePartDecomposition(PartDecomposition object) {
 			return createPartDecompositionAdapter();
 		}
 
-		public Object caseInteractionUse(InteractionUse object) {
+		@Override
+		public Adapter caseInteractionUse(InteractionUse object) {
 			return createInteractionUseAdapter();
 		}
 
-		public Object caseGate(Gate object) {
+		@Override
+		public Adapter caseGate(Gate object) {
 			return createGateAdapter();
 		}
 
-		public Object caseGeneralOrdering(GeneralOrdering object) {
+		@Override
+		public Adapter caseGeneralOrdering(GeneralOrdering object) {
 			return createGeneralOrderingAdapter();
 		}
 
-		public Object caseOccurrenceSpecification(OccurrenceSpecification object) {
+		@Override
+		public Adapter caseOccurrenceSpecification(
+				OccurrenceSpecification object) {
 			return createOccurrenceSpecificationAdapter();
 		}
 
-		public Object caseInteractionOperand(InteractionOperand object) {
+		@Override
+		public Adapter caseInteractionOperand(InteractionOperand object) {
 			return createInteractionOperandAdapter();
 		}
 
-		public Object caseInteractionConstraint(InteractionConstraint object) {
+		@Override
+		public Adapter caseInteractionConstraint(InteractionConstraint object) {
 			return createInteractionConstraintAdapter();
 		}
 
-		public Object caseExecutionSpecification(ExecutionSpecification object) {
+		@Override
+		public Adapter caseExecutionSpecification(ExecutionSpecification object) {
 			return createExecutionSpecificationAdapter();
 		}
 
-		public Object caseStateInvariant(StateInvariant object) {
+		@Override
+		public Adapter caseStateInvariant(StateInvariant object) {
 			return createStateInvariantAdapter();
 		}
 
-		public Object caseActionExecutionSpecification(
+		@Override
+		public Adapter caseActionExecutionSpecification(
 				ActionExecutionSpecification object) {
 			return createActionExecutionSpecificationAdapter();
 		}
 
-		public Object caseBehaviorExecutionSpecification(
+		@Override
+		public Adapter caseBehaviorExecutionSpecification(
 				BehaviorExecutionSpecification object) {
 			return createBehaviorExecutionSpecificationAdapter();
 		}
 
-		public Object caseExecutionEvent(ExecutionEvent object) {
+		@Override
+		public Adapter caseExecutionEvent(ExecutionEvent object) {
 			return createExecutionEventAdapter();
 		}
 
-		public Object caseCreationEvent(CreationEvent object) {
+		@Override
+		public Adapter caseCreationEvent(CreationEvent object) {
 			return createCreationEventAdapter();
 		}
 
-		public Object caseDestructionEvent(DestructionEvent object) {
+		@Override
+		public Adapter caseDestructionEvent(DestructionEvent object) {
 			return createDestructionEventAdapter();
 		}
 
-		public Object caseSendOperationEvent(SendOperationEvent object) {
+		@Override
+		public Adapter caseSendOperationEvent(SendOperationEvent object) {
 			return createSendOperationEventAdapter();
 		}
 
-		public Object caseMessageEvent(MessageEvent object) {
+		@Override
+		public Adapter caseMessageEvent(MessageEvent object) {
 			return createMessageEventAdapter();
 		}
 
-		public Object caseSendSignalEvent(SendSignalEvent object) {
+		@Override
+		public Adapter caseSendSignalEvent(SendSignalEvent object) {
 			return createSendSignalEventAdapter();
 		}
 
-		public Object caseMessageOccurrenceSpecification(
+		@Override
+		public Adapter caseMessageOccurrenceSpecification(
 				MessageOccurrenceSpecification object) {
 			return createMessageOccurrenceSpecificationAdapter();
 		}
 
-		public Object caseExecutionOccurrenceSpecification(
+		@Override
+		public Adapter caseExecutionOccurrenceSpecification(
 				ExecutionOccurrenceSpecification object) {
 			return createExecutionOccurrenceSpecificationAdapter();
 		}
 
-		public Object caseReceiveOperationEvent(ReceiveOperationEvent object) {
+		@Override
+		public Adapter caseReceiveOperationEvent(ReceiveOperationEvent object) {
 			return createReceiveOperationEventAdapter();
 		}
 
-		public Object caseReceiveSignalEvent(ReceiveSignalEvent object) {
+		@Override
+		public Adapter caseReceiveSignalEvent(ReceiveSignalEvent object) {
 			return createReceiveSignalEventAdapter();
 		}
 
-		public Object caseActor(Actor object) {
+		@Override
+		public Adapter caseActor(Actor object) {
 			return createActorAdapter();
 		}
 
-		public Object caseCallEvent(CallEvent object) {
+		@Override
+		public Adapter caseCallEvent(CallEvent object) {
 			return createCallEventAdapter();
 		}
 
-		public Object caseChangeEvent(ChangeEvent object) {
+		@Override
+		public Adapter caseChangeEvent(ChangeEvent object) {
 			return createChangeEventAdapter();
 		}
 
-		public Object caseSignalEvent(SignalEvent object) {
+		@Override
+		public Adapter caseSignalEvent(SignalEvent object) {
 			return createSignalEventAdapter();
 		}
 
-		public Object caseAnyReceiveEvent(AnyReceiveEvent object) {
+		@Override
+		public Adapter caseAnyReceiveEvent(AnyReceiveEvent object) {
 			return createAnyReceiveEventAdapter();
 		}
 
-		public Object caseForkNode(ForkNode object) {
+		@Override
+		public Adapter caseForkNode(ForkNode object) {
 			return createForkNodeAdapter();
 		}
 
-		public Object caseFlowFinalNode(FlowFinalNode object) {
+		@Override
+		public Adapter caseFlowFinalNode(FlowFinalNode object) {
 			return createFlowFinalNodeAdapter();
 		}
 
-		public Object caseFinalNode(FinalNode object) {
+		@Override
+		public Adapter caseFinalNode(FinalNode object) {
 			return createFinalNodeAdapter();
 		}
 
-		public Object caseCentralBufferNode(CentralBufferNode object) {
+		@Override
+		public Adapter caseCentralBufferNode(CentralBufferNode object) {
 			return createCentralBufferNodeAdapter();
 		}
 
-		public Object caseMergeNode(MergeNode object) {
+		@Override
+		public Adapter caseMergeNode(MergeNode object) {
 			return createMergeNodeAdapter();
 		}
 
-		public Object caseDecisionNode(DecisionNode object) {
+		@Override
+		public Adapter caseDecisionNode(DecisionNode object) {
 			return createDecisionNodeAdapter();
 		}
 
-		public Object caseActivityFinalNode(ActivityFinalNode object) {
+		@Override
+		public Adapter caseActivityFinalNode(ActivityFinalNode object) {
 			return createActivityFinalNodeAdapter();
 		}
 
-		public Object caseComponentRealization(ComponentRealization object) {
+		@Override
+		public Adapter caseComponentRealization(ComponentRealization object) {
 			return createComponentRealizationAdapter();
 		}
 
-		public Object caseComponent(Component object) {
+		@Override
+		public Adapter caseComponent(Component object) {
 			return createComponentAdapter();
 		}
 
-		public Object caseNode(Node object) {
+		@Override
+		public Adapter caseNode(Node object) {
 			return createNodeAdapter();
 		}
 
-		public Object caseDevice(Device object) {
+		@Override
+		public Adapter caseDevice(Device object) {
 			return createDeviceAdapter();
 		}
 
-		public Object caseExecutionEnvironment(ExecutionEnvironment object) {
+		@Override
+		public Adapter caseExecutionEnvironment(ExecutionEnvironment object) {
 			return createExecutionEnvironmentAdapter();
 		}
 
-		public Object caseCommunicationPath(CommunicationPath object) {
+		@Override
+		public Adapter caseCommunicationPath(CommunicationPath object) {
 			return createCommunicationPathAdapter();
 		}
 
-		public Object caseCombinedFragment(CombinedFragment object) {
+		@Override
+		public Adapter caseCombinedFragment(CombinedFragment object) {
 			return createCombinedFragmentAdapter();
 		}
 
-		public Object caseContinuation(Continuation object) {
+		@Override
+		public Adapter caseContinuation(Continuation object) {
 			return createContinuationAdapter();
 		}
 
-		public Object caseConsiderIgnoreFragment(ConsiderIgnoreFragment object) {
+		@Override
+		public Adapter caseConsiderIgnoreFragment(ConsiderIgnoreFragment object) {
 			return createConsiderIgnoreFragmentAdapter();
 		}
 
-		public Object caseCreateObjectAction(CreateObjectAction object) {
+		@Override
+		public Adapter caseCreateObjectAction(CreateObjectAction object) {
 			return createCreateObjectActionAdapter();
 		}
 
-		public Object caseDestroyObjectAction(DestroyObjectAction object) {
+		@Override
+		public Adapter caseDestroyObjectAction(DestroyObjectAction object) {
 			return createDestroyObjectActionAdapter();
 		}
 
-		public Object caseTestIdentityAction(TestIdentityAction object) {
+		@Override
+		public Adapter caseTestIdentityAction(TestIdentityAction object) {
 			return createTestIdentityActionAdapter();
 		}
 
-		public Object caseReadSelfAction(ReadSelfAction object) {
+		@Override
+		public Adapter caseReadSelfAction(ReadSelfAction object) {
 			return createReadSelfActionAdapter();
 		}
 
-		public Object caseStructuralFeatureAction(StructuralFeatureAction object) {
+		@Override
+		public Adapter caseStructuralFeatureAction(
+				StructuralFeatureAction object) {
 			return createStructuralFeatureActionAdapter();
 		}
 
-		public Object caseReadStructuralFeatureAction(
+		@Override
+		public Adapter caseReadStructuralFeatureAction(
 				ReadStructuralFeatureAction object) {
 			return createReadStructuralFeatureActionAdapter();
 		}
 
-		public Object caseWriteStructuralFeatureAction(
+		@Override
+		public Adapter caseWriteStructuralFeatureAction(
 				WriteStructuralFeatureAction object) {
 			return createWriteStructuralFeatureActionAdapter();
 		}
 
-		public Object caseClearStructuralFeatureAction(
+		@Override
+		public Adapter caseClearStructuralFeatureAction(
 				ClearStructuralFeatureAction object) {
 			return createClearStructuralFeatureActionAdapter();
 		}
 
-		public Object caseRemoveStructuralFeatureValueAction(
+		@Override
+		public Adapter caseRemoveStructuralFeatureValueAction(
 				RemoveStructuralFeatureValueAction object) {
 			return createRemoveStructuralFeatureValueActionAdapter();
 		}
 
-		public Object caseAddStructuralFeatureValueAction(
+		@Override
+		public Adapter caseAddStructuralFeatureValueAction(
 				AddStructuralFeatureValueAction object) {
 			return createAddStructuralFeatureValueActionAdapter();
 		}
 
-		public Object caseLinkAction(LinkAction object) {
+		@Override
+		public Adapter caseLinkAction(LinkAction object) {
 			return createLinkActionAdapter();
 		}
 
-		public Object caseLinkEndData(LinkEndData object) {
+		@Override
+		public Adapter caseLinkEndData(LinkEndData object) {
 			return createLinkEndDataAdapter();
 		}
 
-		public Object caseQualifierValue(QualifierValue object) {
+		@Override
+		public Adapter caseQualifierValue(QualifierValue object) {
 			return createQualifierValueAdapter();
 		}
 
-		public Object caseReadLinkAction(ReadLinkAction object) {
+		@Override
+		public Adapter caseReadLinkAction(ReadLinkAction object) {
 			return createReadLinkActionAdapter();
 		}
 
-		public Object caseLinkEndCreationData(LinkEndCreationData object) {
+		@Override
+		public Adapter caseLinkEndCreationData(LinkEndCreationData object) {
 			return createLinkEndCreationDataAdapter();
 		}
 
-		public Object caseCreateLinkAction(CreateLinkAction object) {
+		@Override
+		public Adapter caseCreateLinkAction(CreateLinkAction object) {
 			return createCreateLinkActionAdapter();
 		}
 
-		public Object caseWriteLinkAction(WriteLinkAction object) {
+		@Override
+		public Adapter caseWriteLinkAction(WriteLinkAction object) {
 			return createWriteLinkActionAdapter();
 		}
 
-		public Object caseDestroyLinkAction(DestroyLinkAction object) {
+		@Override
+		public Adapter caseDestroyLinkAction(DestroyLinkAction object) {
 			return createDestroyLinkActionAdapter();
 		}
 
-		public Object caseLinkEndDestructionData(LinkEndDestructionData object) {
+		@Override
+		public Adapter caseLinkEndDestructionData(LinkEndDestructionData object) {
 			return createLinkEndDestructionDataAdapter();
 		}
 
-		public Object caseClearAssociationAction(ClearAssociationAction object) {
+		@Override
+		public Adapter caseClearAssociationAction(ClearAssociationAction object) {
 			return createClearAssociationActionAdapter();
 		}
 
-		public Object caseBroadcastSignalAction(BroadcastSignalAction object) {
+		@Override
+		public Adapter caseBroadcastSignalAction(BroadcastSignalAction object) {
 			return createBroadcastSignalActionAdapter();
 		}
 
-		public Object caseSendObjectAction(SendObjectAction object) {
+		@Override
+		public Adapter caseSendObjectAction(SendObjectAction object) {
 			return createSendObjectActionAdapter();
 		}
 
-		public Object caseValueSpecificationAction(
+		@Override
+		public Adapter caseValueSpecificationAction(
 				ValueSpecificationAction object) {
 			return createValueSpecificationActionAdapter();
 		}
 
-		public Object caseTimeExpression(TimeExpression object) {
+		@Override
+		public Adapter caseTimeExpression(TimeExpression object) {
 			return createTimeExpressionAdapter();
 		}
 
-		public Object caseObservation(Observation object) {
+		@Override
+		public Adapter caseObservation(Observation object) {
 			return createObservationAdapter();
 		}
 
-		public Object caseDuration(Duration object) {
+		@Override
+		public Adapter caseDuration(Duration object) {
 			return createDurationAdapter();
 		}
 
-		public Object caseDurationInterval(DurationInterval object) {
+		@Override
+		public Adapter caseDurationInterval(DurationInterval object) {
 			return createDurationIntervalAdapter();
 		}
 
-		public Object caseInterval(Interval object) {
+		@Override
+		public Adapter caseInterval(Interval object) {
 			return createIntervalAdapter();
 		}
 
-		public Object caseTimeConstraint(TimeConstraint object) {
+		@Override
+		public Adapter caseTimeConstraint(TimeConstraint object) {
 			return createTimeConstraintAdapter();
 		}
 
-		public Object caseIntervalConstraint(IntervalConstraint object) {
+		@Override
+		public Adapter caseIntervalConstraint(IntervalConstraint object) {
 			return createIntervalConstraintAdapter();
 		}
 
-		public Object caseTimeInterval(TimeInterval object) {
+		@Override
+		public Adapter caseTimeInterval(TimeInterval object) {
 			return createTimeIntervalAdapter();
 		}
 
-		public Object caseDurationConstraint(DurationConstraint object) {
+		@Override
+		public Adapter caseDurationConstraint(DurationConstraint object) {
 			return createDurationConstraintAdapter();
 		}
 
-		public Object caseTimeObservation(TimeObservation object) {
+		@Override
+		public Adapter caseTimeObservation(TimeObservation object) {
 			return createTimeObservationAdapter();
 		}
 
-		public Object caseDurationObservation(DurationObservation object) {
+		@Override
+		public Adapter caseDurationObservation(DurationObservation object) {
 			return createDurationObservationAdapter();
 		}
 
-		public Object caseFinalState(FinalState object) {
+		@Override
+		public Adapter caseFinalState(FinalState object) {
 			return createFinalStateAdapter();
 		}
 
-		public Object caseTimeEvent(TimeEvent object) {
+		@Override
+		public Adapter caseTimeEvent(TimeEvent object) {
 			return createTimeEventAdapter();
 		}
 
-		public Object caseVariableAction(VariableAction object) {
+		@Override
+		public Adapter caseVariableAction(VariableAction object) {
 			return createVariableActionAdapter();
 		}
 
-		public Object caseReadVariableAction(ReadVariableAction object) {
+		@Override
+		public Adapter caseReadVariableAction(ReadVariableAction object) {
 			return createReadVariableActionAdapter();
 		}
 
-		public Object caseWriteVariableAction(WriteVariableAction object) {
+		@Override
+		public Adapter caseWriteVariableAction(WriteVariableAction object) {
 			return createWriteVariableActionAdapter();
 		}
 
-		public Object caseClearVariableAction(ClearVariableAction object) {
+		@Override
+		public Adapter caseClearVariableAction(ClearVariableAction object) {
 			return createClearVariableActionAdapter();
 		}
 
-		public Object caseAddVariableValueAction(AddVariableValueAction object) {
+		@Override
+		public Adapter caseAddVariableValueAction(AddVariableValueAction object) {
 			return createAddVariableValueActionAdapter();
 		}
 
-		public Object caseRemoveVariableValueAction(
+		@Override
+		public Adapter caseRemoveVariableValueAction(
 				RemoveVariableValueAction object) {
 			return createRemoveVariableValueActionAdapter();
 		}
 
-		public Object caseRaiseExceptionAction(RaiseExceptionAction object) {
+		@Override
+		public Adapter caseRaiseExceptionAction(RaiseExceptionAction object) {
 			return createRaiseExceptionActionAdapter();
 		}
 
-		public Object caseActionInputPin(ActionInputPin object) {
+		@Override
+		public Adapter caseActionInputPin(ActionInputPin object) {
 			return createActionInputPinAdapter();
 		}
 
-		public Object caseInformationItem(InformationItem object) {
+		@Override
+		public Adapter caseInformationItem(InformationItem object) {
 			return createInformationItemAdapter();
 		}
 
-		public Object caseInformationFlow(InformationFlow object) {
+		@Override
+		public Adapter caseInformationFlow(InformationFlow object) {
 			return createInformationFlowAdapter();
 		}
 
-		public Object caseReadExtentAction(ReadExtentAction object) {
+		@Override
+		public Adapter caseReadExtentAction(ReadExtentAction object) {
 			return createReadExtentActionAdapter();
 		}
 
-		public Object caseReclassifyObjectAction(ReclassifyObjectAction object) {
+		@Override
+		public Adapter caseReclassifyObjectAction(ReclassifyObjectAction object) {
 			return createReclassifyObjectActionAdapter();
 		}
 
-		public Object caseReadIsClassifiedObjectAction(
+		@Override
+		public Adapter caseReadIsClassifiedObjectAction(
 				ReadIsClassifiedObjectAction object) {
 			return createReadIsClassifiedObjectActionAdapter();
 		}
 
-		public Object caseStartClassifierBehaviorAction(
+		@Override
+		public Adapter caseStartClassifierBehaviorAction(
 				StartClassifierBehaviorAction object) {
 			return createStartClassifierBehaviorActionAdapter();
 		}
 
-		public Object caseReadLinkObjectEndAction(ReadLinkObjectEndAction object) {
+		@Override
+		public Adapter caseReadLinkObjectEndAction(
+				ReadLinkObjectEndAction object) {
 			return createReadLinkObjectEndActionAdapter();
 		}
 
-		public Object caseReadLinkObjectEndQualifierAction(
+		@Override
+		public Adapter caseReadLinkObjectEndQualifierAction(
 				ReadLinkObjectEndQualifierAction object) {
 			return createReadLinkObjectEndQualifierActionAdapter();
 		}
 
-		public Object caseCreateLinkObjectAction(CreateLinkObjectAction object) {
+		@Override
+		public Adapter caseCreateLinkObjectAction(CreateLinkObjectAction object) {
 			return createCreateLinkObjectActionAdapter();
 		}
 
-		public Object caseAcceptEventAction(AcceptEventAction object) {
+		@Override
+		public Adapter caseAcceptEventAction(AcceptEventAction object) {
 			return createAcceptEventActionAdapter();
 		}
 
-		public Object caseAcceptCallAction(AcceptCallAction object) {
+		@Override
+		public Adapter caseAcceptCallAction(AcceptCallAction object) {
 			return createAcceptCallActionAdapter();
 		}
 
-		public Object caseReplyAction(ReplyAction object) {
+		@Override
+		public Adapter caseReplyAction(ReplyAction object) {
 			return createReplyActionAdapter();
 		}
 
-		public Object caseUnmarshallAction(UnmarshallAction object) {
+		@Override
+		public Adapter caseUnmarshallAction(UnmarshallAction object) {
 			return createUnmarshallActionAdapter();
 		}
 
-		public Object caseReduceAction(ReduceAction object) {
+		@Override
+		public Adapter caseReduceAction(ReduceAction object) {
 			return createReduceActionAdapter();
 		}
 
-		public Object caseJoinNode(JoinNode object) {
+		@Override
+		public Adapter caseJoinNode(JoinNode object) {
 			return createJoinNodeAdapter();
 		}
 
-		public Object caseDataStoreNode(DataStoreNode object) {
+		@Override
+		public Adapter caseDataStoreNode(DataStoreNode object) {
 			return createDataStoreNodeAdapter();
 		}
 
-		public Object caseObjectFlow(ObjectFlow object) {
+		@Override
+		public Adapter caseObjectFlow(ObjectFlow object) {
 			return createObjectFlowAdapter();
 		}
 
-		public Object caseConditionalNode(ConditionalNode object) {
+		@Override
+		public Adapter caseConditionalNode(ConditionalNode object) {
 			return createConditionalNodeAdapter();
 		}
 
-		public Object caseClause(Clause object) {
+		@Override
+		public Adapter caseClause(Clause object) {
 			return createClauseAdapter();
 		}
 
-		public Object caseLoopNode(LoopNode object) {
+		@Override
+		public Adapter caseLoopNode(LoopNode object) {
 			return createLoopNodeAdapter();
 		}
 
-		public Object caseExpansionNode(ExpansionNode object) {
+		@Override
+		public Adapter caseExpansionNode(ExpansionNode object) {
 			return createExpansionNodeAdapter();
 		}
 
-		public Object caseExpansionRegion(ExpansionRegion object) {
+		@Override
+		public Adapter caseExpansionRegion(ExpansionRegion object) {
 			return createExpansionRegionAdapter();
 		}
 
-		public Object caseProtocolTransition(ProtocolTransition object) {
+		@Override
+		public Adapter caseProtocolTransition(ProtocolTransition object) {
 			return createProtocolTransitionAdapter();
 		}
 
-		public Object caseAssociationClass(AssociationClass object) {
+		@Override
+		public Adapter caseAssociationClass(AssociationClass object) {
 			return createAssociationClassAdapter();
 		}
 
-		public Object caseEModelElement(EModelElement object) {
+		@Override
+		public Adapter caseEModelElement(EModelElement object) {
 			return createEModelElementAdapter();
 		}
 
-		public Object defaultCase(EObject object) {
+		@Override
+		public Adapter defaultCase(EObject object) {
 			return createEObjectAdapter();
 		}
 	};
@@ -1345,8 +1599,9 @@
 	 * @return the adapter for the <code>target</code>.
 	 * @generated
 	 */
+	@Override
 	public Adapter createAdapter(Notifier target) {
-		return (Adapter) modelSwitch.doSwitch((EObject) target);
+		return modelSwitch.doSwitch((EObject) target);
 	}
 
 	/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLSwitch.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLSwitch.java
index f41a38e..bd28849 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLSwitch.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLSwitch.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLSwitch.java,v 1.11 2006/05/16 15:07:26 khussey Exp $
+ * $Id: UMLSwitch.java,v 1.12 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.util;
 
@@ -277,7 +277,7 @@
  * @see org.eclipse.uml2.uml.UMLPackage
  * @generated
  */
-public class UMLSwitch {
+public class UMLSwitch<T> {
 
 	/**
 	 * The cached model package
@@ -306,7 +306,7 @@
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	public Object doSwitch(EObject theEObject) {
+	public T doSwitch(EObject theEObject) {
 		return doSwitch(theEObject.eClass(), theEObject);
 	}
 
@@ -317,14 +317,14 @@
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
+	protected T doSwitch(EClass theEClass, EObject theEObject) {
 		if (theEClass.eContainer() == modelPackage) {
 			return doSwitch(theEClass.getClassifierID(), theEObject);
 		} else {
-			List eSuperTypes = theEClass.getESuperTypes();
+			List<EClass> eSuperTypes = theEClass.getESuperTypes();
 			return eSuperTypes.isEmpty()
 				? defaultCase(theEObject)
-				: doSwitch((EClass) eSuperTypes.get(0), theEObject);
+				: doSwitch(eSuperTypes.get(0), theEObject);
 		}
 	}
 
@@ -335,11 +335,11 @@
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
+	protected T doSwitch(int classifierID, EObject theEObject) {
 		switch (classifierID) {
 			case UMLPackage.COMMENT : {
 				Comment comment = (Comment) theEObject;
-				Object result = caseComment(comment);
+				T result = caseComment(comment);
 				if (result == null)
 					result = caseElement(comment);
 				if (result == null)
@@ -350,7 +350,7 @@
 			}
 			case UMLPackage.ELEMENT : {
 				Element element = (Element) theEObject;
-				Object result = caseElement(element);
+				T result = caseElement(element);
 				if (result == null)
 					result = caseEModelElement(element);
 				if (result == null)
@@ -359,7 +359,7 @@
 			}
 			case UMLPackage.PACKAGE : {
 				org.eclipse.uml2.uml.Package package_ = (org.eclipse.uml2.uml.Package) theEObject;
-				Object result = casePackage(package_);
+				T result = casePackage(package_);
 				if (result == null)
 					result = caseNamespace(package_);
 				if (result == null)
@@ -380,7 +380,7 @@
 			}
 			case UMLPackage.PACKAGEABLE_ELEMENT : {
 				PackageableElement packageableElement = (PackageableElement) theEObject;
-				Object result = casePackageableElement(packageableElement);
+				T result = casePackageableElement(packageableElement);
 				if (result == null)
 					result = caseNamedElement(packageableElement);
 				if (result == null)
@@ -395,7 +395,7 @@
 			}
 			case UMLPackage.NAMED_ELEMENT : {
 				NamedElement namedElement = (NamedElement) theEObject;
-				Object result = caseNamedElement(namedElement);
+				T result = caseNamedElement(namedElement);
 				if (result == null)
 					result = caseElement(namedElement);
 				if (result == null)
@@ -406,7 +406,7 @@
 			}
 			case UMLPackage.DEPENDENCY : {
 				Dependency dependency = (Dependency) theEObject;
-				Object result = caseDependency(dependency);
+				T result = caseDependency(dependency);
 				if (result == null)
 					result = casePackageableElement(dependency);
 				if (result == null)
@@ -427,7 +427,7 @@
 			}
 			case UMLPackage.DIRECTED_RELATIONSHIP : {
 				DirectedRelationship directedRelationship = (DirectedRelationship) theEObject;
-				Object result = caseDirectedRelationship(directedRelationship);
+				T result = caseDirectedRelationship(directedRelationship);
 				if (result == null)
 					result = caseRelationship(directedRelationship);
 				if (result == null)
@@ -440,7 +440,7 @@
 			}
 			case UMLPackage.RELATIONSHIP : {
 				Relationship relationship = (Relationship) theEObject;
-				Object result = caseRelationship(relationship);
+				T result = caseRelationship(relationship);
 				if (result == null)
 					result = caseElement(relationship);
 				if (result == null)
@@ -451,7 +451,7 @@
 			}
 			case UMLPackage.NAMESPACE : {
 				Namespace namespace = (Namespace) theEObject;
-				Object result = caseNamespace(namespace);
+				T result = caseNamespace(namespace);
 				if (result == null)
 					result = caseNamedElement(namespace);
 				if (result == null)
@@ -464,7 +464,7 @@
 			}
 			case UMLPackage.ELEMENT_IMPORT : {
 				ElementImport elementImport = (ElementImport) theEObject;
-				Object result = caseElementImport(elementImport);
+				T result = caseElementImport(elementImport);
 				if (result == null)
 					result = caseDirectedRelationship(elementImport);
 				if (result == null)
@@ -479,7 +479,7 @@
 			}
 			case UMLPackage.PACKAGE_IMPORT : {
 				PackageImport packageImport = (PackageImport) theEObject;
-				Object result = casePackageImport(packageImport);
+				T result = casePackageImport(packageImport);
 				if (result == null)
 					result = caseDirectedRelationship(packageImport);
 				if (result == null)
@@ -494,7 +494,7 @@
 			}
 			case UMLPackage.CONSTRAINT : {
 				Constraint constraint = (Constraint) theEObject;
-				Object result = caseConstraint(constraint);
+				T result = caseConstraint(constraint);
 				if (result == null)
 					result = casePackageableElement(constraint);
 				if (result == null)
@@ -511,7 +511,7 @@
 			}
 			case UMLPackage.VALUE_SPECIFICATION : {
 				ValueSpecification valueSpecification = (ValueSpecification) theEObject;
-				Object result = caseValueSpecification(valueSpecification);
+				T result = caseValueSpecification(valueSpecification);
 				if (result == null)
 					result = casePackageableElement(valueSpecification);
 				if (result == null)
@@ -530,7 +530,7 @@
 			}
 			case UMLPackage.TYPED_ELEMENT : {
 				TypedElement typedElement = (TypedElement) theEObject;
-				Object result = caseTypedElement(typedElement);
+				T result = caseTypedElement(typedElement);
 				if (result == null)
 					result = caseNamedElement(typedElement);
 				if (result == null)
@@ -543,7 +543,7 @@
 			}
 			case UMLPackage.TYPE : {
 				Type type = (Type) theEObject;
-				Object result = caseType(type);
+				T result = caseType(type);
 				if (result == null)
 					result = casePackageableElement(type);
 				if (result == null)
@@ -560,7 +560,7 @@
 			}
 			case UMLPackage.ASSOCIATION : {
 				Association association = (Association) theEObject;
-				Object result = caseAssociation(association);
+				T result = caseAssociation(association);
 				if (result == null)
 					result = caseClassifier(association);
 				if (result == null)
@@ -589,7 +589,7 @@
 			}
 			case UMLPackage.CLASSIFIER : {
 				Classifier classifier = (Classifier) theEObject;
-				Object result = caseClassifier(classifier);
+				T result = caseClassifier(classifier);
 				if (result == null)
 					result = caseNamespace(classifier);
 				if (result == null)
@@ -614,7 +614,7 @@
 			}
 			case UMLPackage.REDEFINABLE_ELEMENT : {
 				RedefinableElement redefinableElement = (RedefinableElement) theEObject;
-				Object result = caseRedefinableElement(redefinableElement);
+				T result = caseRedefinableElement(redefinableElement);
 				if (result == null)
 					result = caseNamedElement(redefinableElement);
 				if (result == null)
@@ -627,7 +627,7 @@
 			}
 			case UMLPackage.TEMPLATEABLE_ELEMENT : {
 				TemplateableElement templateableElement = (TemplateableElement) theEObject;
-				Object result = caseTemplateableElement(templateableElement);
+				T result = caseTemplateableElement(templateableElement);
 				if (result == null)
 					result = caseElement(templateableElement);
 				if (result == null)
@@ -638,7 +638,7 @@
 			}
 			case UMLPackage.TEMPLATE_BINDING : {
 				TemplateBinding templateBinding = (TemplateBinding) theEObject;
-				Object result = caseTemplateBinding(templateBinding);
+				T result = caseTemplateBinding(templateBinding);
 				if (result == null)
 					result = caseDirectedRelationship(templateBinding);
 				if (result == null)
@@ -653,7 +653,7 @@
 			}
 			case UMLPackage.TEMPLATE_SIGNATURE : {
 				TemplateSignature templateSignature = (TemplateSignature) theEObject;
-				Object result = caseTemplateSignature(templateSignature);
+				T result = caseTemplateSignature(templateSignature);
 				if (result == null)
 					result = caseElement(templateSignature);
 				if (result == null)
@@ -664,7 +664,7 @@
 			}
 			case UMLPackage.TEMPLATE_PARAMETER : {
 				TemplateParameter templateParameter = (TemplateParameter) theEObject;
-				Object result = caseTemplateParameter(templateParameter);
+				T result = caseTemplateParameter(templateParameter);
 				if (result == null)
 					result = caseElement(templateParameter);
 				if (result == null)
@@ -675,7 +675,7 @@
 			}
 			case UMLPackage.PARAMETERABLE_ELEMENT : {
 				ParameterableElement parameterableElement = (ParameterableElement) theEObject;
-				Object result = caseParameterableElement(parameterableElement);
+				T result = caseParameterableElement(parameterableElement);
 				if (result == null)
 					result = caseElement(parameterableElement);
 				if (result == null)
@@ -686,7 +686,7 @@
 			}
 			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION : {
 				TemplateParameterSubstitution templateParameterSubstitution = (TemplateParameterSubstitution) theEObject;
-				Object result = caseTemplateParameterSubstitution(templateParameterSubstitution);
+				T result = caseTemplateParameterSubstitution(templateParameterSubstitution);
 				if (result == null)
 					result = caseElement(templateParameterSubstitution);
 				if (result == null)
@@ -697,7 +697,7 @@
 			}
 			case UMLPackage.GENERALIZATION : {
 				Generalization generalization = (Generalization) theEObject;
-				Object result = caseGeneralization(generalization);
+				T result = caseGeneralization(generalization);
 				if (result == null)
 					result = caseDirectedRelationship(generalization);
 				if (result == null)
@@ -712,7 +712,7 @@
 			}
 			case UMLPackage.GENERALIZATION_SET : {
 				GeneralizationSet generalizationSet = (GeneralizationSet) theEObject;
-				Object result = caseGeneralizationSet(generalizationSet);
+				T result = caseGeneralizationSet(generalizationSet);
 				if (result == null)
 					result = casePackageableElement(generalizationSet);
 				if (result == null)
@@ -729,7 +729,7 @@
 			}
 			case UMLPackage.FEATURE : {
 				Feature feature = (Feature) theEObject;
-				Object result = caseFeature(feature);
+				T result = caseFeature(feature);
 				if (result == null)
 					result = caseRedefinableElement(feature);
 				if (result == null)
@@ -744,7 +744,7 @@
 			}
 			case UMLPackage.SUBSTITUTION : {
 				Substitution substitution = (Substitution) theEObject;
-				Object result = caseSubstitution(substitution);
+				T result = caseSubstitution(substitution);
 				if (result == null)
 					result = caseRealization(substitution);
 				if (result == null)
@@ -771,7 +771,7 @@
 			}
 			case UMLPackage.REALIZATION : {
 				Realization realization = (Realization) theEObject;
-				Object result = caseRealization(realization);
+				T result = caseRealization(realization);
 				if (result == null)
 					result = caseAbstraction(realization);
 				if (result == null)
@@ -796,7 +796,7 @@
 			}
 			case UMLPackage.ABSTRACTION : {
 				Abstraction abstraction = (Abstraction) theEObject;
-				Object result = caseAbstraction(abstraction);
+				T result = caseAbstraction(abstraction);
 				if (result == null)
 					result = caseDependency(abstraction);
 				if (result == null)
@@ -819,7 +819,7 @@
 			}
 			case UMLPackage.OPAQUE_EXPRESSION : {
 				OpaqueExpression opaqueExpression = (OpaqueExpression) theEObject;
-				Object result = caseOpaqueExpression(opaqueExpression);
+				T result = caseOpaqueExpression(opaqueExpression);
 				if (result == null)
 					result = caseValueSpecification(opaqueExpression);
 				if (result == null)
@@ -840,7 +840,7 @@
 			}
 			case UMLPackage.PARAMETER : {
 				Parameter parameter = (Parameter) theEObject;
-				Object result = caseParameter(parameter);
+				T result = caseParameter(parameter);
 				if (result == null)
 					result = caseConnectableElement(parameter);
 				if (result == null)
@@ -861,7 +861,7 @@
 			}
 			case UMLPackage.MULTIPLICITY_ELEMENT : {
 				MultiplicityElement multiplicityElement = (MultiplicityElement) theEObject;
-				Object result = caseMultiplicityElement(multiplicityElement);
+				T result = caseMultiplicityElement(multiplicityElement);
 				if (result == null)
 					result = caseElement(multiplicityElement);
 				if (result == null)
@@ -872,7 +872,7 @@
 			}
 			case UMLPackage.CONNECTABLE_ELEMENT : {
 				ConnectableElement connectableElement = (ConnectableElement) theEObject;
-				Object result = caseConnectableElement(connectableElement);
+				T result = caseConnectableElement(connectableElement);
 				if (result == null)
 					result = caseTypedElement(connectableElement);
 				if (result == null)
@@ -889,7 +889,7 @@
 			}
 			case UMLPackage.CONNECTOR_END : {
 				ConnectorEnd connectorEnd = (ConnectorEnd) theEObject;
-				Object result = caseConnectorEnd(connectorEnd);
+				T result = caseConnectorEnd(connectorEnd);
 				if (result == null)
 					result = caseMultiplicityElement(connectorEnd);
 				if (result == null)
@@ -902,7 +902,7 @@
 			}
 			case UMLPackage.PROPERTY : {
 				Property property = (Property) theEObject;
-				Object result = caseProperty(property);
+				T result = caseProperty(property);
 				if (result == null)
 					result = caseStructuralFeature(property);
 				if (result == null)
@@ -933,7 +933,7 @@
 			}
 			case UMLPackage.DEPLOYMENT_TARGET : {
 				DeploymentTarget deploymentTarget = (DeploymentTarget) theEObject;
-				Object result = caseDeploymentTarget(deploymentTarget);
+				T result = caseDeploymentTarget(deploymentTarget);
 				if (result == null)
 					result = caseNamedElement(deploymentTarget);
 				if (result == null)
@@ -946,7 +946,7 @@
 			}
 			case UMLPackage.DEPLOYMENT : {
 				Deployment deployment = (Deployment) theEObject;
-				Object result = caseDeployment(deployment);
+				T result = caseDeployment(deployment);
 				if (result == null)
 					result = caseDependency(deployment);
 				if (result == null)
@@ -969,7 +969,7 @@
 			}
 			case UMLPackage.DEPLOYED_ARTIFACT : {
 				DeployedArtifact deployedArtifact = (DeployedArtifact) theEObject;
-				Object result = caseDeployedArtifact(deployedArtifact);
+				T result = caseDeployedArtifact(deployedArtifact);
 				if (result == null)
 					result = caseNamedElement(deployedArtifact);
 				if (result == null)
@@ -982,7 +982,7 @@
 			}
 			case UMLPackage.DEPLOYMENT_SPECIFICATION : {
 				DeploymentSpecification deploymentSpecification = (DeploymentSpecification) theEObject;
-				Object result = caseDeploymentSpecification(deploymentSpecification);
+				T result = caseDeploymentSpecification(deploymentSpecification);
 				if (result == null)
 					result = caseArtifact(deploymentSpecification);
 				if (result == null)
@@ -1013,7 +1013,7 @@
 			}
 			case UMLPackage.ARTIFACT : {
 				Artifact artifact = (Artifact) theEObject;
-				Object result = caseArtifact(artifact);
+				T result = caseArtifact(artifact);
 				if (result == null)
 					result = caseClassifier(artifact);
 				if (result == null)
@@ -1042,7 +1042,7 @@
 			}
 			case UMLPackage.MANIFESTATION : {
 				Manifestation manifestation = (Manifestation) theEObject;
-				Object result = caseManifestation(manifestation);
+				T result = caseManifestation(manifestation);
 				if (result == null)
 					result = caseAbstraction(manifestation);
 				if (result == null)
@@ -1067,7 +1067,7 @@
 			}
 			case UMLPackage.OPERATION : {
 				Operation operation = (Operation) theEObject;
-				Object result = caseOperation(operation);
+				T result = caseOperation(operation);
 				if (result == null)
 					result = caseBehavioralFeature(operation);
 				if (result == null)
@@ -1092,7 +1092,7 @@
 			}
 			case UMLPackage.BEHAVIORAL_FEATURE : {
 				BehavioralFeature behavioralFeature = (BehavioralFeature) theEObject;
-				Object result = caseBehavioralFeature(behavioralFeature);
+				T result = caseBehavioralFeature(behavioralFeature);
 				if (result == null)
 					result = caseNamespace(behavioralFeature);
 				if (result == null)
@@ -1111,7 +1111,7 @@
 			}
 			case UMLPackage.BEHAVIOR : {
 				Behavior behavior = (Behavior) theEObject;
-				Object result = caseBehavior(behavior);
+				T result = caseBehavior(behavior);
 				if (result == null)
 					result = caseClass(behavior);
 				if (result == null)
@@ -1146,7 +1146,7 @@
 			}
 			case UMLPackage.CLASS : {
 				org.eclipse.uml2.uml.Class class_ = (org.eclipse.uml2.uml.Class) theEObject;
-				Object result = caseClass(class_);
+				T result = caseClass(class_);
 				if (result == null)
 					result = caseEncapsulatedClassifier(class_);
 				if (result == null)
@@ -1179,7 +1179,7 @@
 			}
 			case UMLPackage.BEHAVIORED_CLASSIFIER : {
 				BehavioredClassifier behavioredClassifier = (BehavioredClassifier) theEObject;
-				Object result = caseBehavioredClassifier(behavioredClassifier);
+				T result = caseBehavioredClassifier(behavioredClassifier);
 				if (result == null)
 					result = caseClassifier(behavioredClassifier);
 				if (result == null)
@@ -1206,7 +1206,7 @@
 			}
 			case UMLPackage.INTERFACE_REALIZATION : {
 				InterfaceRealization interfaceRealization = (InterfaceRealization) theEObject;
-				Object result = caseInterfaceRealization(interfaceRealization);
+				T result = caseInterfaceRealization(interfaceRealization);
 				if (result == null)
 					result = caseRealization(interfaceRealization);
 				if (result == null)
@@ -1233,7 +1233,7 @@
 			}
 			case UMLPackage.INTERFACE : {
 				Interface interface_ = (Interface) theEObject;
-				Object result = caseInterface(interface_);
+				T result = caseInterface(interface_);
 				if (result == null)
 					result = caseClassifier(interface_);
 				if (result == null)
@@ -1260,7 +1260,7 @@
 			}
 			case UMLPackage.RECEPTION : {
 				Reception reception = (Reception) theEObject;
-				Object result = caseReception(reception);
+				T result = caseReception(reception);
 				if (result == null)
 					result = caseBehavioralFeature(reception);
 				if (result == null)
@@ -1281,7 +1281,7 @@
 			}
 			case UMLPackage.SIGNAL : {
 				Signal signal = (Signal) theEObject;
-				Object result = caseSignal(signal);
+				T result = caseSignal(signal);
 				if (result == null)
 					result = caseClassifier(signal);
 				if (result == null)
@@ -1308,7 +1308,7 @@
 			}
 			case UMLPackage.PROTOCOL_STATE_MACHINE : {
 				ProtocolStateMachine protocolStateMachine = (ProtocolStateMachine) theEObject;
-				Object result = caseProtocolStateMachine(protocolStateMachine);
+				T result = caseProtocolStateMachine(protocolStateMachine);
 				if (result == null)
 					result = caseStateMachine(protocolStateMachine);
 				if (result == null)
@@ -1347,7 +1347,7 @@
 			}
 			case UMLPackage.STATE_MACHINE : {
 				StateMachine stateMachine = (StateMachine) theEObject;
-				Object result = caseStateMachine(stateMachine);
+				T result = caseStateMachine(stateMachine);
 				if (result == null)
 					result = caseBehavior(stateMachine);
 				if (result == null)
@@ -1384,7 +1384,7 @@
 			}
 			case UMLPackage.REGION : {
 				Region region = (Region) theEObject;
-				Object result = caseRegion(region);
+				T result = caseRegion(region);
 				if (result == null)
 					result = caseNamespace(region);
 				if (result == null)
@@ -1401,7 +1401,7 @@
 			}
 			case UMLPackage.VERTEX : {
 				Vertex vertex = (Vertex) theEObject;
-				Object result = caseVertex(vertex);
+				T result = caseVertex(vertex);
 				if (result == null)
 					result = caseNamedElement(vertex);
 				if (result == null)
@@ -1414,7 +1414,7 @@
 			}
 			case UMLPackage.TRANSITION : {
 				Transition transition = (Transition) theEObject;
-				Object result = caseTransition(transition);
+				T result = caseTransition(transition);
 				if (result == null)
 					result = caseNamespace(transition);
 				if (result == null)
@@ -1431,7 +1431,7 @@
 			}
 			case UMLPackage.TRIGGER : {
 				Trigger trigger = (Trigger) theEObject;
-				Object result = caseTrigger(trigger);
+				T result = caseTrigger(trigger);
 				if (result == null)
 					result = caseNamedElement(trigger);
 				if (result == null)
@@ -1444,7 +1444,7 @@
 			}
 			case UMLPackage.EVENT : {
 				Event event = (Event) theEObject;
-				Object result = caseEvent(event);
+				T result = caseEvent(event);
 				if (result == null)
 					result = casePackageableElement(event);
 				if (result == null)
@@ -1461,7 +1461,7 @@
 			}
 			case UMLPackage.PORT : {
 				Port port = (Port) theEObject;
-				Object result = casePort(port);
+				T result = casePort(port);
 				if (result == null)
 					result = caseProperty(port);
 				if (result == null)
@@ -1494,7 +1494,7 @@
 			}
 			case UMLPackage.STATE : {
 				State state = (State) theEObject;
-				Object result = caseState(state);
+				T result = caseState(state);
 				if (result == null)
 					result = caseNamespace(state);
 				if (result == null)
@@ -1513,7 +1513,7 @@
 			}
 			case UMLPackage.CONNECTION_POINT_REFERENCE : {
 				ConnectionPointReference connectionPointReference = (ConnectionPointReference) theEObject;
-				Object result = caseConnectionPointReference(connectionPointReference);
+				T result = caseConnectionPointReference(connectionPointReference);
 				if (result == null)
 					result = caseVertex(connectionPointReference);
 				if (result == null)
@@ -1528,7 +1528,7 @@
 			}
 			case UMLPackage.PSEUDOSTATE : {
 				Pseudostate pseudostate = (Pseudostate) theEObject;
-				Object result = casePseudostate(pseudostate);
+				T result = casePseudostate(pseudostate);
 				if (result == null)
 					result = caseVertex(pseudostate);
 				if (result == null)
@@ -1543,7 +1543,7 @@
 			}
 			case UMLPackage.PROTOCOL_CONFORMANCE : {
 				ProtocolConformance protocolConformance = (ProtocolConformance) theEObject;
-				Object result = caseProtocolConformance(protocolConformance);
+				T result = caseProtocolConformance(protocolConformance);
 				if (result == null)
 					result = caseDirectedRelationship(protocolConformance);
 				if (result == null)
@@ -1558,7 +1558,7 @@
 			}
 			case UMLPackage.ENCAPSULATED_CLASSIFIER : {
 				EncapsulatedClassifier encapsulatedClassifier = (EncapsulatedClassifier) theEObject;
-				Object result = caseEncapsulatedClassifier(encapsulatedClassifier);
+				T result = caseEncapsulatedClassifier(encapsulatedClassifier);
 				if (result == null)
 					result = caseStructuredClassifier(encapsulatedClassifier);
 				if (result == null)
@@ -1587,7 +1587,7 @@
 			}
 			case UMLPackage.STRUCTURED_CLASSIFIER : {
 				StructuredClassifier structuredClassifier = (StructuredClassifier) theEObject;
-				Object result = caseStructuredClassifier(structuredClassifier);
+				T result = caseStructuredClassifier(structuredClassifier);
 				if (result == null)
 					result = caseClassifier(structuredClassifier);
 				if (result == null)
@@ -1614,7 +1614,7 @@
 			}
 			case UMLPackage.CONNECTOR : {
 				Connector connector = (Connector) theEObject;
-				Object result = caseConnector(connector);
+				T result = caseConnector(connector);
 				if (result == null)
 					result = caseFeature(connector);
 				if (result == null)
@@ -1631,7 +1631,7 @@
 			}
 			case UMLPackage.EXTENSION : {
 				Extension extension = (Extension) theEObject;
-				Object result = caseExtension(extension);
+				T result = caseExtension(extension);
 				if (result == null)
 					result = caseAssociation(extension);
 				if (result == null)
@@ -1662,7 +1662,7 @@
 			}
 			case UMLPackage.EXTENSION_END : {
 				ExtensionEnd extensionEnd = (ExtensionEnd) theEObject;
-				Object result = caseExtensionEnd(extensionEnd);
+				T result = caseExtensionEnd(extensionEnd);
 				if (result == null)
 					result = caseProperty(extensionEnd);
 				if (result == null)
@@ -1695,7 +1695,7 @@
 			}
 			case UMLPackage.STEREOTYPE : {
 				Stereotype stereotype = (Stereotype) theEObject;
-				Object result = caseStereotype(stereotype);
+				T result = caseStereotype(stereotype);
 				if (result == null)
 					result = caseClass(stereotype);
 				if (result == null)
@@ -1730,7 +1730,7 @@
 			}
 			case UMLPackage.IMAGE : {
 				Image image = (Image) theEObject;
-				Object result = caseImage(image);
+				T result = caseImage(image);
 				if (result == null)
 					result = caseElement(image);
 				if (result == null)
@@ -1741,7 +1741,7 @@
 			}
 			case UMLPackage.PROFILE : {
 				Profile profile = (Profile) theEObject;
-				Object result = caseProfile(profile);
+				T result = caseProfile(profile);
 				if (result == null)
 					result = casePackage(profile);
 				if (result == null)
@@ -1764,7 +1764,7 @@
 			}
 			case UMLPackage.MODEL : {
 				Model model = (Model) theEObject;
-				Object result = caseModel(model);
+				T result = caseModel(model);
 				if (result == null)
 					result = casePackage(model);
 				if (result == null)
@@ -1787,7 +1787,7 @@
 			}
 			case UMLPackage.PARAMETER_SET : {
 				ParameterSet parameterSet = (ParameterSet) theEObject;
-				Object result = caseParameterSet(parameterSet);
+				T result = caseParameterSet(parameterSet);
 				if (result == null)
 					result = caseNamedElement(parameterSet);
 				if (result == null)
@@ -1800,7 +1800,7 @@
 			}
 			case UMLPackage.DATA_TYPE : {
 				DataType dataType = (DataType) theEObject;
-				Object result = caseDataType(dataType);
+				T result = caseDataType(dataType);
 				if (result == null)
 					result = caseClassifier(dataType);
 				if (result == null)
@@ -1827,7 +1827,7 @@
 			}
 			case UMLPackage.OPERATION_TEMPLATE_PARAMETER : {
 				OperationTemplateParameter operationTemplateParameter = (OperationTemplateParameter) theEObject;
-				Object result = caseOperationTemplateParameter(operationTemplateParameter);
+				T result = caseOperationTemplateParameter(operationTemplateParameter);
 				if (result == null)
 					result = caseTemplateParameter(operationTemplateParameter);
 				if (result == null)
@@ -1840,7 +1840,7 @@
 			}
 			case UMLPackage.STRUCTURAL_FEATURE : {
 				StructuralFeature structuralFeature = (StructuralFeature) theEObject;
-				Object result = caseStructuralFeature(structuralFeature);
+				T result = caseStructuralFeature(structuralFeature);
 				if (result == null)
 					result = caseFeature(structuralFeature);
 				if (result == null)
@@ -1861,7 +1861,7 @@
 			}
 			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER : {
 				ConnectableElementTemplateParameter connectableElementTemplateParameter = (ConnectableElementTemplateParameter) theEObject;
-				Object result = caseConnectableElementTemplateParameter(connectableElementTemplateParameter);
+				T result = caseConnectableElementTemplateParameter(connectableElementTemplateParameter);
 				if (result == null)
 					result = caseTemplateParameter(connectableElementTemplateParameter);
 				if (result == null)
@@ -1874,7 +1874,7 @@
 			}
 			case UMLPackage.COLLABORATION_USE : {
 				CollaborationUse collaborationUse = (CollaborationUse) theEObject;
-				Object result = caseCollaborationUse(collaborationUse);
+				T result = caseCollaborationUse(collaborationUse);
 				if (result == null)
 					result = caseNamedElement(collaborationUse);
 				if (result == null)
@@ -1887,7 +1887,7 @@
 			}
 			case UMLPackage.COLLABORATION : {
 				Collaboration collaboration = (Collaboration) theEObject;
-				Object result = caseCollaboration(collaboration);
+				T result = caseCollaboration(collaboration);
 				if (result == null)
 					result = caseBehavioredClassifier(collaboration);
 				if (result == null)
@@ -1918,7 +1918,7 @@
 			}
 			case UMLPackage.USE_CASE : {
 				UseCase useCase = (UseCase) theEObject;
-				Object result = caseUseCase(useCase);
+				T result = caseUseCase(useCase);
 				if (result == null)
 					result = caseBehavioredClassifier(useCase);
 				if (result == null)
@@ -1947,7 +1947,7 @@
 			}
 			case UMLPackage.INCLUDE : {
 				Include include = (Include) theEObject;
-				Object result = caseInclude(include);
+				T result = caseInclude(include);
 				if (result == null)
 					result = caseNamedElement(include);
 				if (result == null)
@@ -1964,7 +1964,7 @@
 			}
 			case UMLPackage.EXTEND : {
 				Extend extend = (Extend) theEObject;
-				Object result = caseExtend(extend);
+				T result = caseExtend(extend);
 				if (result == null)
 					result = caseNamedElement(extend);
 				if (result == null)
@@ -1981,7 +1981,7 @@
 			}
 			case UMLPackage.EXTENSION_POINT : {
 				ExtensionPoint extensionPoint = (ExtensionPoint) theEObject;
-				Object result = caseExtensionPoint(extensionPoint);
+				T result = caseExtensionPoint(extensionPoint);
 				if (result == null)
 					result = caseRedefinableElement(extensionPoint);
 				if (result == null)
@@ -1996,7 +1996,7 @@
 			}
 			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE : {
 				RedefinableTemplateSignature redefinableTemplateSignature = (RedefinableTemplateSignature) theEObject;
-				Object result = caseRedefinableTemplateSignature(redefinableTemplateSignature);
+				T result = caseRedefinableTemplateSignature(redefinableTemplateSignature);
 				if (result == null)
 					result = caseRedefinableElement(redefinableTemplateSignature);
 				if (result == null)
@@ -2013,7 +2013,7 @@
 			}
 			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER : {
 				ClassifierTemplateParameter classifierTemplateParameter = (ClassifierTemplateParameter) theEObject;
-				Object result = caseClassifierTemplateParameter(classifierTemplateParameter);
+				T result = caseClassifierTemplateParameter(classifierTemplateParameter);
 				if (result == null)
 					result = caseTemplateParameter(classifierTemplateParameter);
 				if (result == null)
@@ -2026,7 +2026,7 @@
 			}
 			case UMLPackage.STRING_EXPRESSION : {
 				StringExpression stringExpression = (StringExpression) theEObject;
-				Object result = caseStringExpression(stringExpression);
+				T result = caseStringExpression(stringExpression);
 				if (result == null)
 					result = caseExpression(stringExpression);
 				if (result == null)
@@ -2051,7 +2051,7 @@
 			}
 			case UMLPackage.EXPRESSION : {
 				Expression expression = (Expression) theEObject;
-				Object result = caseExpression(expression);
+				T result = caseExpression(expression);
 				if (result == null)
 					result = caseValueSpecification(expression);
 				if (result == null)
@@ -2072,7 +2072,7 @@
 			}
 			case UMLPackage.PACKAGE_MERGE : {
 				PackageMerge packageMerge = (PackageMerge) theEObject;
-				Object result = casePackageMerge(packageMerge);
+				T result = casePackageMerge(packageMerge);
 				if (result == null)
 					result = caseDirectedRelationship(packageMerge);
 				if (result == null)
@@ -2087,7 +2087,7 @@
 			}
 			case UMLPackage.PROFILE_APPLICATION : {
 				ProfileApplication profileApplication = (ProfileApplication) theEObject;
-				Object result = caseProfileApplication(profileApplication);
+				T result = caseProfileApplication(profileApplication);
 				if (result == null)
 					result = caseDirectedRelationship(profileApplication);
 				if (result == null)
@@ -2102,7 +2102,7 @@
 			}
 			case UMLPackage.ENUMERATION : {
 				Enumeration enumeration = (Enumeration) theEObject;
-				Object result = caseEnumeration(enumeration);
+				T result = caseEnumeration(enumeration);
 				if (result == null)
 					result = caseDataType(enumeration);
 				if (result == null)
@@ -2131,7 +2131,7 @@
 			}
 			case UMLPackage.ENUMERATION_LITERAL : {
 				EnumerationLiteral enumerationLiteral = (EnumerationLiteral) theEObject;
-				Object result = caseEnumerationLiteral(enumerationLiteral);
+				T result = caseEnumerationLiteral(enumerationLiteral);
 				if (result == null)
 					result = caseInstanceSpecification(enumerationLiteral);
 				if (result == null)
@@ -2154,7 +2154,7 @@
 			}
 			case UMLPackage.INSTANCE_SPECIFICATION : {
 				InstanceSpecification instanceSpecification = (InstanceSpecification) theEObject;
-				Object result = caseInstanceSpecification(instanceSpecification);
+				T result = caseInstanceSpecification(instanceSpecification);
 				if (result == null)
 					result = caseDeploymentTarget(instanceSpecification);
 				if (result == null)
@@ -2175,7 +2175,7 @@
 			}
 			case UMLPackage.SLOT : {
 				Slot slot = (Slot) theEObject;
-				Object result = caseSlot(slot);
+				T result = caseSlot(slot);
 				if (result == null)
 					result = caseElement(slot);
 				if (result == null)
@@ -2186,7 +2186,7 @@
 			}
 			case UMLPackage.PRIMITIVE_TYPE : {
 				PrimitiveType primitiveType = (PrimitiveType) theEObject;
-				Object result = casePrimitiveType(primitiveType);
+				T result = casePrimitiveType(primitiveType);
 				if (result == null)
 					result = caseDataType(primitiveType);
 				if (result == null)
@@ -2215,7 +2215,7 @@
 			}
 			case UMLPackage.LITERAL_SPECIFICATION : {
 				LiteralSpecification literalSpecification = (LiteralSpecification) theEObject;
-				Object result = caseLiteralSpecification(literalSpecification);
+				T result = caseLiteralSpecification(literalSpecification);
 				if (result == null)
 					result = caseValueSpecification(literalSpecification);
 				if (result == null)
@@ -2236,7 +2236,7 @@
 			}
 			case UMLPackage.LITERAL_INTEGER : {
 				LiteralInteger literalInteger = (LiteralInteger) theEObject;
-				Object result = caseLiteralInteger(literalInteger);
+				T result = caseLiteralInteger(literalInteger);
 				if (result == null)
 					result = caseLiteralSpecification(literalInteger);
 				if (result == null)
@@ -2259,7 +2259,7 @@
 			}
 			case UMLPackage.LITERAL_STRING : {
 				LiteralString literalString = (LiteralString) theEObject;
-				Object result = caseLiteralString(literalString);
+				T result = caseLiteralString(literalString);
 				if (result == null)
 					result = caseLiteralSpecification(literalString);
 				if (result == null)
@@ -2282,7 +2282,7 @@
 			}
 			case UMLPackage.LITERAL_BOOLEAN : {
 				LiteralBoolean literalBoolean = (LiteralBoolean) theEObject;
-				Object result = caseLiteralBoolean(literalBoolean);
+				T result = caseLiteralBoolean(literalBoolean);
 				if (result == null)
 					result = caseLiteralSpecification(literalBoolean);
 				if (result == null)
@@ -2305,7 +2305,7 @@
 			}
 			case UMLPackage.LITERAL_NULL : {
 				LiteralNull literalNull = (LiteralNull) theEObject;
-				Object result = caseLiteralNull(literalNull);
+				T result = caseLiteralNull(literalNull);
 				if (result == null)
 					result = caseLiteralSpecification(literalNull);
 				if (result == null)
@@ -2328,7 +2328,7 @@
 			}
 			case UMLPackage.INSTANCE_VALUE : {
 				InstanceValue instanceValue = (InstanceValue) theEObject;
-				Object result = caseInstanceValue(instanceValue);
+				T result = caseInstanceValue(instanceValue);
 				if (result == null)
 					result = caseValueSpecification(instanceValue);
 				if (result == null)
@@ -2349,7 +2349,7 @@
 			}
 			case UMLPackage.LITERAL_UNLIMITED_NATURAL : {
 				LiteralUnlimitedNatural literalUnlimitedNatural = (LiteralUnlimitedNatural) theEObject;
-				Object result = caseLiteralUnlimitedNatural(literalUnlimitedNatural);
+				T result = caseLiteralUnlimitedNatural(literalUnlimitedNatural);
 				if (result == null)
 					result = caseLiteralSpecification(literalUnlimitedNatural);
 				if (result == null)
@@ -2372,7 +2372,7 @@
 			}
 			case UMLPackage.OPAQUE_BEHAVIOR : {
 				OpaqueBehavior opaqueBehavior = (OpaqueBehavior) theEObject;
-				Object result = caseOpaqueBehavior(opaqueBehavior);
+				T result = caseOpaqueBehavior(opaqueBehavior);
 				if (result == null)
 					result = caseBehavior(opaqueBehavior);
 				if (result == null)
@@ -2409,7 +2409,7 @@
 			}
 			case UMLPackage.FUNCTION_BEHAVIOR : {
 				FunctionBehavior functionBehavior = (FunctionBehavior) theEObject;
-				Object result = caseFunctionBehavior(functionBehavior);
+				T result = caseFunctionBehavior(functionBehavior);
 				if (result == null)
 					result = caseOpaqueBehavior(functionBehavior);
 				if (result == null)
@@ -2448,7 +2448,7 @@
 			}
 			case UMLPackage.OPAQUE_ACTION : {
 				OpaqueAction opaqueAction = (OpaqueAction) theEObject;
-				Object result = caseOpaqueAction(opaqueAction);
+				T result = caseOpaqueAction(opaqueAction);
 				if (result == null)
 					result = caseAction(opaqueAction);
 				if (result == null)
@@ -2469,7 +2469,7 @@
 			}
 			case UMLPackage.ACTION : {
 				Action action = (Action) theEObject;
-				Object result = caseAction(action);
+				T result = caseAction(action);
 				if (result == null)
 					result = caseExecutableNode(action);
 				if (result == null)
@@ -2488,7 +2488,7 @@
 			}
 			case UMLPackage.EXECUTABLE_NODE : {
 				ExecutableNode executableNode = (ExecutableNode) theEObject;
-				Object result = caseExecutableNode(executableNode);
+				T result = caseExecutableNode(executableNode);
 				if (result == null)
 					result = caseActivityNode(executableNode);
 				if (result == null)
@@ -2505,7 +2505,7 @@
 			}
 			case UMLPackage.ACTIVITY_NODE : {
 				ActivityNode activityNode = (ActivityNode) theEObject;
-				Object result = caseActivityNode(activityNode);
+				T result = caseActivityNode(activityNode);
 				if (result == null)
 					result = caseRedefinableElement(activityNode);
 				if (result == null)
@@ -2520,7 +2520,7 @@
 			}
 			case UMLPackage.STRUCTURED_ACTIVITY_NODE : {
 				StructuredActivityNode structuredActivityNode = (StructuredActivityNode) theEObject;
-				Object result = caseStructuredActivityNode(structuredActivityNode);
+				T result = caseStructuredActivityNode(structuredActivityNode);
 				if (result == null)
 					result = caseAction(structuredActivityNode);
 				if (result == null)
@@ -2545,7 +2545,7 @@
 			}
 			case UMLPackage.ACTIVITY_GROUP : {
 				ActivityGroup activityGroup = (ActivityGroup) theEObject;
-				Object result = caseActivityGroup(activityGroup);
+				T result = caseActivityGroup(activityGroup);
 				if (result == null)
 					result = caseElement(activityGroup);
 				if (result == null)
@@ -2556,7 +2556,7 @@
 			}
 			case UMLPackage.ACTIVITY : {
 				Activity activity = (Activity) theEObject;
-				Object result = caseActivity(activity);
+				T result = caseActivity(activity);
 				if (result == null)
 					result = caseBehavior(activity);
 				if (result == null)
@@ -2593,7 +2593,7 @@
 			}
 			case UMLPackage.VARIABLE : {
 				Variable variable = (Variable) theEObject;
-				Object result = caseVariable(variable);
+				T result = caseVariable(variable);
 				if (result == null)
 					result = caseConnectableElement(variable);
 				if (result == null)
@@ -2614,7 +2614,7 @@
 			}
 			case UMLPackage.ACTIVITY_EDGE : {
 				ActivityEdge activityEdge = (ActivityEdge) theEObject;
-				Object result = caseActivityEdge(activityEdge);
+				T result = caseActivityEdge(activityEdge);
 				if (result == null)
 					result = caseRedefinableElement(activityEdge);
 				if (result == null)
@@ -2629,7 +2629,7 @@
 			}
 			case UMLPackage.ACTIVITY_PARTITION : {
 				ActivityPartition activityPartition = (ActivityPartition) theEObject;
-				Object result = caseActivityPartition(activityPartition);
+				T result = caseActivityPartition(activityPartition);
 				if (result == null)
 					result = caseNamedElement(activityPartition);
 				if (result == null)
@@ -2644,7 +2644,7 @@
 			}
 			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION : {
 				InterruptibleActivityRegion interruptibleActivityRegion = (InterruptibleActivityRegion) theEObject;
-				Object result = caseInterruptibleActivityRegion(interruptibleActivityRegion);
+				T result = caseInterruptibleActivityRegion(interruptibleActivityRegion);
 				if (result == null)
 					result = caseActivityGroup(interruptibleActivityRegion);
 				if (result == null)
@@ -2657,7 +2657,7 @@
 			}
 			case UMLPackage.EXCEPTION_HANDLER : {
 				ExceptionHandler exceptionHandler = (ExceptionHandler) theEObject;
-				Object result = caseExceptionHandler(exceptionHandler);
+				T result = caseExceptionHandler(exceptionHandler);
 				if (result == null)
 					result = caseElement(exceptionHandler);
 				if (result == null)
@@ -2668,7 +2668,7 @@
 			}
 			case UMLPackage.OBJECT_NODE : {
 				ObjectNode objectNode = (ObjectNode) theEObject;
-				Object result = caseObjectNode(objectNode);
+				T result = caseObjectNode(objectNode);
 				if (result == null)
 					result = caseActivityNode(objectNode);
 				if (result == null)
@@ -2687,7 +2687,7 @@
 			}
 			case UMLPackage.OUTPUT_PIN : {
 				OutputPin outputPin = (OutputPin) theEObject;
-				Object result = caseOutputPin(outputPin);
+				T result = caseOutputPin(outputPin);
 				if (result == null)
 					result = casePin(outputPin);
 				if (result == null)
@@ -2712,7 +2712,7 @@
 			}
 			case UMLPackage.PIN : {
 				Pin pin = (Pin) theEObject;
-				Object result = casePin(pin);
+				T result = casePin(pin);
 				if (result == null)
 					result = caseObjectNode(pin);
 				if (result == null)
@@ -2735,7 +2735,7 @@
 			}
 			case UMLPackage.INPUT_PIN : {
 				InputPin inputPin = (InputPin) theEObject;
-				Object result = caseInputPin(inputPin);
+				T result = caseInputPin(inputPin);
 				if (result == null)
 					result = casePin(inputPin);
 				if (result == null)
@@ -2760,7 +2760,7 @@
 			}
 			case UMLPackage.CALL_ACTION : {
 				CallAction callAction = (CallAction) theEObject;
-				Object result = caseCallAction(callAction);
+				T result = caseCallAction(callAction);
 				if (result == null)
 					result = caseInvocationAction(callAction);
 				if (result == null)
@@ -2783,7 +2783,7 @@
 			}
 			case UMLPackage.INVOCATION_ACTION : {
 				InvocationAction invocationAction = (InvocationAction) theEObject;
-				Object result = caseInvocationAction(invocationAction);
+				T result = caseInvocationAction(invocationAction);
 				if (result == null)
 					result = caseAction(invocationAction);
 				if (result == null)
@@ -2804,7 +2804,7 @@
 			}
 			case UMLPackage.SEND_SIGNAL_ACTION : {
 				SendSignalAction sendSignalAction = (SendSignalAction) theEObject;
-				Object result = caseSendSignalAction(sendSignalAction);
+				T result = caseSendSignalAction(sendSignalAction);
 				if (result == null)
 					result = caseInvocationAction(sendSignalAction);
 				if (result == null)
@@ -2827,7 +2827,7 @@
 			}
 			case UMLPackage.CALL_OPERATION_ACTION : {
 				CallOperationAction callOperationAction = (CallOperationAction) theEObject;
-				Object result = caseCallOperationAction(callOperationAction);
+				T result = caseCallOperationAction(callOperationAction);
 				if (result == null)
 					result = caseCallAction(callOperationAction);
 				if (result == null)
@@ -2852,7 +2852,7 @@
 			}
 			case UMLPackage.CALL_BEHAVIOR_ACTION : {
 				CallBehaviorAction callBehaviorAction = (CallBehaviorAction) theEObject;
-				Object result = caseCallBehaviorAction(callBehaviorAction);
+				T result = caseCallBehaviorAction(callBehaviorAction);
 				if (result == null)
 					result = caseCallAction(callBehaviorAction);
 				if (result == null)
@@ -2877,7 +2877,7 @@
 			}
 			case UMLPackage.SEQUENCE_NODE : {
 				SequenceNode sequenceNode = (SequenceNode) theEObject;
-				Object result = caseSequenceNode(sequenceNode);
+				T result = caseSequenceNode(sequenceNode);
 				if (result == null)
 					result = caseStructuredActivityNode(sequenceNode);
 				if (result == null)
@@ -2904,7 +2904,7 @@
 			}
 			case UMLPackage.USAGE : {
 				Usage usage = (Usage) theEObject;
-				Object result = caseUsage(usage);
+				T result = caseUsage(usage);
 				if (result == null)
 					result = caseDependency(usage);
 				if (result == null)
@@ -2927,7 +2927,7 @@
 			}
 			case UMLPackage.CONTROL_NODE : {
 				ControlNode controlNode = (ControlNode) theEObject;
-				Object result = caseControlNode(controlNode);
+				T result = caseControlNode(controlNode);
 				if (result == null)
 					result = caseActivityNode(controlNode);
 				if (result == null)
@@ -2944,7 +2944,7 @@
 			}
 			case UMLPackage.CONTROL_FLOW : {
 				ControlFlow controlFlow = (ControlFlow) theEObject;
-				Object result = caseControlFlow(controlFlow);
+				T result = caseControlFlow(controlFlow);
 				if (result == null)
 					result = caseActivityEdge(controlFlow);
 				if (result == null)
@@ -2961,7 +2961,7 @@
 			}
 			case UMLPackage.INITIAL_NODE : {
 				InitialNode initialNode = (InitialNode) theEObject;
-				Object result = caseInitialNode(initialNode);
+				T result = caseInitialNode(initialNode);
 				if (result == null)
 					result = caseControlNode(initialNode);
 				if (result == null)
@@ -2980,7 +2980,7 @@
 			}
 			case UMLPackage.ACTIVITY_PARAMETER_NODE : {
 				ActivityParameterNode activityParameterNode = (ActivityParameterNode) theEObject;
-				Object result = caseActivityParameterNode(activityParameterNode);
+				T result = caseActivityParameterNode(activityParameterNode);
 				if (result == null)
 					result = caseObjectNode(activityParameterNode);
 				if (result == null)
@@ -3001,7 +3001,7 @@
 			}
 			case UMLPackage.VALUE_PIN : {
 				ValuePin valuePin = (ValuePin) theEObject;
-				Object result = caseValuePin(valuePin);
+				T result = caseValuePin(valuePin);
 				if (result == null)
 					result = caseInputPin(valuePin);
 				if (result == null)
@@ -3028,7 +3028,7 @@
 			}
 			case UMLPackage.MESSAGE : {
 				Message message = (Message) theEObject;
-				Object result = caseMessage(message);
+				T result = caseMessage(message);
 				if (result == null)
 					result = caseNamedElement(message);
 				if (result == null)
@@ -3041,7 +3041,7 @@
 			}
 			case UMLPackage.MESSAGE_END : {
 				MessageEnd messageEnd = (MessageEnd) theEObject;
-				Object result = caseMessageEnd(messageEnd);
+				T result = caseMessageEnd(messageEnd);
 				if (result == null)
 					result = caseNamedElement(messageEnd);
 				if (result == null)
@@ -3054,7 +3054,7 @@
 			}
 			case UMLPackage.INTERACTION : {
 				Interaction interaction = (Interaction) theEObject;
-				Object result = caseInteraction(interaction);
+				T result = caseInteraction(interaction);
 				if (result == null)
 					result = caseBehavior(interaction);
 				if (result == null)
@@ -3093,7 +3093,7 @@
 			}
 			case UMLPackage.INTERACTION_FRAGMENT : {
 				InteractionFragment interactionFragment = (InteractionFragment) theEObject;
-				Object result = caseInteractionFragment(interactionFragment);
+				T result = caseInteractionFragment(interactionFragment);
 				if (result == null)
 					result = caseNamedElement(interactionFragment);
 				if (result == null)
@@ -3106,7 +3106,7 @@
 			}
 			case UMLPackage.LIFELINE : {
 				Lifeline lifeline = (Lifeline) theEObject;
-				Object result = caseLifeline(lifeline);
+				T result = caseLifeline(lifeline);
 				if (result == null)
 					result = caseNamedElement(lifeline);
 				if (result == null)
@@ -3119,7 +3119,7 @@
 			}
 			case UMLPackage.PART_DECOMPOSITION : {
 				PartDecomposition partDecomposition = (PartDecomposition) theEObject;
-				Object result = casePartDecomposition(partDecomposition);
+				T result = casePartDecomposition(partDecomposition);
 				if (result == null)
 					result = caseInteractionUse(partDecomposition);
 				if (result == null)
@@ -3136,7 +3136,7 @@
 			}
 			case UMLPackage.INTERACTION_USE : {
 				InteractionUse interactionUse = (InteractionUse) theEObject;
-				Object result = caseInteractionUse(interactionUse);
+				T result = caseInteractionUse(interactionUse);
 				if (result == null)
 					result = caseInteractionFragment(interactionUse);
 				if (result == null)
@@ -3151,7 +3151,7 @@
 			}
 			case UMLPackage.GATE : {
 				Gate gate = (Gate) theEObject;
-				Object result = caseGate(gate);
+				T result = caseGate(gate);
 				if (result == null)
 					result = caseMessageEnd(gate);
 				if (result == null)
@@ -3166,7 +3166,7 @@
 			}
 			case UMLPackage.GENERAL_ORDERING : {
 				GeneralOrdering generalOrdering = (GeneralOrdering) theEObject;
-				Object result = caseGeneralOrdering(generalOrdering);
+				T result = caseGeneralOrdering(generalOrdering);
 				if (result == null)
 					result = caseNamedElement(generalOrdering);
 				if (result == null)
@@ -3179,7 +3179,7 @@
 			}
 			case UMLPackage.OCCURRENCE_SPECIFICATION : {
 				OccurrenceSpecification occurrenceSpecification = (OccurrenceSpecification) theEObject;
-				Object result = caseOccurrenceSpecification(occurrenceSpecification);
+				T result = caseOccurrenceSpecification(occurrenceSpecification);
 				if (result == null)
 					result = caseInteractionFragment(occurrenceSpecification);
 				if (result == null)
@@ -3194,7 +3194,7 @@
 			}
 			case UMLPackage.INTERACTION_OPERAND : {
 				InteractionOperand interactionOperand = (InteractionOperand) theEObject;
-				Object result = caseInteractionOperand(interactionOperand);
+				T result = caseInteractionOperand(interactionOperand);
 				if (result == null)
 					result = caseNamespace(interactionOperand);
 				if (result == null)
@@ -3211,7 +3211,7 @@
 			}
 			case UMLPackage.INTERACTION_CONSTRAINT : {
 				InteractionConstraint interactionConstraint = (InteractionConstraint) theEObject;
-				Object result = caseInteractionConstraint(interactionConstraint);
+				T result = caseInteractionConstraint(interactionConstraint);
 				if (result == null)
 					result = caseConstraint(interactionConstraint);
 				if (result == null)
@@ -3230,7 +3230,7 @@
 			}
 			case UMLPackage.EXECUTION_SPECIFICATION : {
 				ExecutionSpecification executionSpecification = (ExecutionSpecification) theEObject;
-				Object result = caseExecutionSpecification(executionSpecification);
+				T result = caseExecutionSpecification(executionSpecification);
 				if (result == null)
 					result = caseInteractionFragment(executionSpecification);
 				if (result == null)
@@ -3245,7 +3245,7 @@
 			}
 			case UMLPackage.STATE_INVARIANT : {
 				StateInvariant stateInvariant = (StateInvariant) theEObject;
-				Object result = caseStateInvariant(stateInvariant);
+				T result = caseStateInvariant(stateInvariant);
 				if (result == null)
 					result = caseInteractionFragment(stateInvariant);
 				if (result == null)
@@ -3260,7 +3260,7 @@
 			}
 			case UMLPackage.ACTION_EXECUTION_SPECIFICATION : {
 				ActionExecutionSpecification actionExecutionSpecification = (ActionExecutionSpecification) theEObject;
-				Object result = caseActionExecutionSpecification(actionExecutionSpecification);
+				T result = caseActionExecutionSpecification(actionExecutionSpecification);
 				if (result == null)
 					result = caseExecutionSpecification(actionExecutionSpecification);
 				if (result == null)
@@ -3277,7 +3277,7 @@
 			}
 			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION : {
 				BehaviorExecutionSpecification behaviorExecutionSpecification = (BehaviorExecutionSpecification) theEObject;
-				Object result = caseBehaviorExecutionSpecification(behaviorExecutionSpecification);
+				T result = caseBehaviorExecutionSpecification(behaviorExecutionSpecification);
 				if (result == null)
 					result = caseExecutionSpecification(behaviorExecutionSpecification);
 				if (result == null)
@@ -3294,7 +3294,7 @@
 			}
 			case UMLPackage.EXECUTION_EVENT : {
 				ExecutionEvent executionEvent = (ExecutionEvent) theEObject;
-				Object result = caseExecutionEvent(executionEvent);
+				T result = caseExecutionEvent(executionEvent);
 				if (result == null)
 					result = caseEvent(executionEvent);
 				if (result == null)
@@ -3313,7 +3313,7 @@
 			}
 			case UMLPackage.CREATION_EVENT : {
 				CreationEvent creationEvent = (CreationEvent) theEObject;
-				Object result = caseCreationEvent(creationEvent);
+				T result = caseCreationEvent(creationEvent);
 				if (result == null)
 					result = caseEvent(creationEvent);
 				if (result == null)
@@ -3332,7 +3332,7 @@
 			}
 			case UMLPackage.DESTRUCTION_EVENT : {
 				DestructionEvent destructionEvent = (DestructionEvent) theEObject;
-				Object result = caseDestructionEvent(destructionEvent);
+				T result = caseDestructionEvent(destructionEvent);
 				if (result == null)
 					result = caseEvent(destructionEvent);
 				if (result == null)
@@ -3351,7 +3351,7 @@
 			}
 			case UMLPackage.SEND_OPERATION_EVENT : {
 				SendOperationEvent sendOperationEvent = (SendOperationEvent) theEObject;
-				Object result = caseSendOperationEvent(sendOperationEvent);
+				T result = caseSendOperationEvent(sendOperationEvent);
 				if (result == null)
 					result = caseMessageEvent(sendOperationEvent);
 				if (result == null)
@@ -3372,7 +3372,7 @@
 			}
 			case UMLPackage.MESSAGE_EVENT : {
 				MessageEvent messageEvent = (MessageEvent) theEObject;
-				Object result = caseMessageEvent(messageEvent);
+				T result = caseMessageEvent(messageEvent);
 				if (result == null)
 					result = caseEvent(messageEvent);
 				if (result == null)
@@ -3391,7 +3391,7 @@
 			}
 			case UMLPackage.SEND_SIGNAL_EVENT : {
 				SendSignalEvent sendSignalEvent = (SendSignalEvent) theEObject;
-				Object result = caseSendSignalEvent(sendSignalEvent);
+				T result = caseSendSignalEvent(sendSignalEvent);
 				if (result == null)
 					result = caseMessageEvent(sendSignalEvent);
 				if (result == null)
@@ -3412,7 +3412,7 @@
 			}
 			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION : {
 				MessageOccurrenceSpecification messageOccurrenceSpecification = (MessageOccurrenceSpecification) theEObject;
-				Object result = caseMessageOccurrenceSpecification(messageOccurrenceSpecification);
+				T result = caseMessageOccurrenceSpecification(messageOccurrenceSpecification);
 				if (result == null)
 					result = caseOccurrenceSpecification(messageOccurrenceSpecification);
 				if (result == null)
@@ -3431,7 +3431,7 @@
 			}
 			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION : {
 				ExecutionOccurrenceSpecification executionOccurrenceSpecification = (ExecutionOccurrenceSpecification) theEObject;
-				Object result = caseExecutionOccurrenceSpecification(executionOccurrenceSpecification);
+				T result = caseExecutionOccurrenceSpecification(executionOccurrenceSpecification);
 				if (result == null)
 					result = caseOccurrenceSpecification(executionOccurrenceSpecification);
 				if (result == null)
@@ -3448,7 +3448,7 @@
 			}
 			case UMLPackage.RECEIVE_OPERATION_EVENT : {
 				ReceiveOperationEvent receiveOperationEvent = (ReceiveOperationEvent) theEObject;
-				Object result = caseReceiveOperationEvent(receiveOperationEvent);
+				T result = caseReceiveOperationEvent(receiveOperationEvent);
 				if (result == null)
 					result = caseMessageEvent(receiveOperationEvent);
 				if (result == null)
@@ -3469,7 +3469,7 @@
 			}
 			case UMLPackage.RECEIVE_SIGNAL_EVENT : {
 				ReceiveSignalEvent receiveSignalEvent = (ReceiveSignalEvent) theEObject;
-				Object result = caseReceiveSignalEvent(receiveSignalEvent);
+				T result = caseReceiveSignalEvent(receiveSignalEvent);
 				if (result == null)
 					result = caseMessageEvent(receiveSignalEvent);
 				if (result == null)
@@ -3490,7 +3490,7 @@
 			}
 			case UMLPackage.ACTOR : {
 				Actor actor = (Actor) theEObject;
-				Object result = caseActor(actor);
+				T result = caseActor(actor);
 				if (result == null)
 					result = caseBehavioredClassifier(actor);
 				if (result == null)
@@ -3519,7 +3519,7 @@
 			}
 			case UMLPackage.CALL_EVENT : {
 				CallEvent callEvent = (CallEvent) theEObject;
-				Object result = caseCallEvent(callEvent);
+				T result = caseCallEvent(callEvent);
 				if (result == null)
 					result = caseMessageEvent(callEvent);
 				if (result == null)
@@ -3540,7 +3540,7 @@
 			}
 			case UMLPackage.CHANGE_EVENT : {
 				ChangeEvent changeEvent = (ChangeEvent) theEObject;
-				Object result = caseChangeEvent(changeEvent);
+				T result = caseChangeEvent(changeEvent);
 				if (result == null)
 					result = caseEvent(changeEvent);
 				if (result == null)
@@ -3559,7 +3559,7 @@
 			}
 			case UMLPackage.SIGNAL_EVENT : {
 				SignalEvent signalEvent = (SignalEvent) theEObject;
-				Object result = caseSignalEvent(signalEvent);
+				T result = caseSignalEvent(signalEvent);
 				if (result == null)
 					result = caseMessageEvent(signalEvent);
 				if (result == null)
@@ -3580,7 +3580,7 @@
 			}
 			case UMLPackage.ANY_RECEIVE_EVENT : {
 				AnyReceiveEvent anyReceiveEvent = (AnyReceiveEvent) theEObject;
-				Object result = caseAnyReceiveEvent(anyReceiveEvent);
+				T result = caseAnyReceiveEvent(anyReceiveEvent);
 				if (result == null)
 					result = caseMessageEvent(anyReceiveEvent);
 				if (result == null)
@@ -3601,7 +3601,7 @@
 			}
 			case UMLPackage.FORK_NODE : {
 				ForkNode forkNode = (ForkNode) theEObject;
-				Object result = caseForkNode(forkNode);
+				T result = caseForkNode(forkNode);
 				if (result == null)
 					result = caseControlNode(forkNode);
 				if (result == null)
@@ -3620,7 +3620,7 @@
 			}
 			case UMLPackage.FLOW_FINAL_NODE : {
 				FlowFinalNode flowFinalNode = (FlowFinalNode) theEObject;
-				Object result = caseFlowFinalNode(flowFinalNode);
+				T result = caseFlowFinalNode(flowFinalNode);
 				if (result == null)
 					result = caseFinalNode(flowFinalNode);
 				if (result == null)
@@ -3641,7 +3641,7 @@
 			}
 			case UMLPackage.FINAL_NODE : {
 				FinalNode finalNode = (FinalNode) theEObject;
-				Object result = caseFinalNode(finalNode);
+				T result = caseFinalNode(finalNode);
 				if (result == null)
 					result = caseControlNode(finalNode);
 				if (result == null)
@@ -3660,7 +3660,7 @@
 			}
 			case UMLPackage.CENTRAL_BUFFER_NODE : {
 				CentralBufferNode centralBufferNode = (CentralBufferNode) theEObject;
-				Object result = caseCentralBufferNode(centralBufferNode);
+				T result = caseCentralBufferNode(centralBufferNode);
 				if (result == null)
 					result = caseObjectNode(centralBufferNode);
 				if (result == null)
@@ -3681,7 +3681,7 @@
 			}
 			case UMLPackage.MERGE_NODE : {
 				MergeNode mergeNode = (MergeNode) theEObject;
-				Object result = caseMergeNode(mergeNode);
+				T result = caseMergeNode(mergeNode);
 				if (result == null)
 					result = caseControlNode(mergeNode);
 				if (result == null)
@@ -3700,7 +3700,7 @@
 			}
 			case UMLPackage.DECISION_NODE : {
 				DecisionNode decisionNode = (DecisionNode) theEObject;
-				Object result = caseDecisionNode(decisionNode);
+				T result = caseDecisionNode(decisionNode);
 				if (result == null)
 					result = caseControlNode(decisionNode);
 				if (result == null)
@@ -3719,7 +3719,7 @@
 			}
 			case UMLPackage.ACTIVITY_FINAL_NODE : {
 				ActivityFinalNode activityFinalNode = (ActivityFinalNode) theEObject;
-				Object result = caseActivityFinalNode(activityFinalNode);
+				T result = caseActivityFinalNode(activityFinalNode);
 				if (result == null)
 					result = caseFinalNode(activityFinalNode);
 				if (result == null)
@@ -3740,7 +3740,7 @@
 			}
 			case UMLPackage.COMPONENT_REALIZATION : {
 				ComponentRealization componentRealization = (ComponentRealization) theEObject;
-				Object result = caseComponentRealization(componentRealization);
+				T result = caseComponentRealization(componentRealization);
 				if (result == null)
 					result = caseRealization(componentRealization);
 				if (result == null)
@@ -3767,7 +3767,7 @@
 			}
 			case UMLPackage.COMPONENT : {
 				Component component = (Component) theEObject;
-				Object result = caseComponent(component);
+				T result = caseComponent(component);
 				if (result == null)
 					result = caseClass(component);
 				if (result == null)
@@ -3802,7 +3802,7 @@
 			}
 			case UMLPackage.NODE : {
 				Node node = (Node) theEObject;
-				Object result = caseNode(node);
+				T result = caseNode(node);
 				if (result == null)
 					result = caseClass(node);
 				if (result == null)
@@ -3839,7 +3839,7 @@
 			}
 			case UMLPackage.DEVICE : {
 				Device device = (Device) theEObject;
-				Object result = caseDevice(device);
+				T result = caseDevice(device);
 				if (result == null)
 					result = caseNode(device);
 				if (result == null)
@@ -3878,7 +3878,7 @@
 			}
 			case UMLPackage.EXECUTION_ENVIRONMENT : {
 				ExecutionEnvironment executionEnvironment = (ExecutionEnvironment) theEObject;
-				Object result = caseExecutionEnvironment(executionEnvironment);
+				T result = caseExecutionEnvironment(executionEnvironment);
 				if (result == null)
 					result = caseNode(executionEnvironment);
 				if (result == null)
@@ -3917,7 +3917,7 @@
 			}
 			case UMLPackage.COMMUNICATION_PATH : {
 				CommunicationPath communicationPath = (CommunicationPath) theEObject;
-				Object result = caseCommunicationPath(communicationPath);
+				T result = caseCommunicationPath(communicationPath);
 				if (result == null)
 					result = caseAssociation(communicationPath);
 				if (result == null)
@@ -3948,7 +3948,7 @@
 			}
 			case UMLPackage.COMBINED_FRAGMENT : {
 				CombinedFragment combinedFragment = (CombinedFragment) theEObject;
-				Object result = caseCombinedFragment(combinedFragment);
+				T result = caseCombinedFragment(combinedFragment);
 				if (result == null)
 					result = caseInteractionFragment(combinedFragment);
 				if (result == null)
@@ -3963,7 +3963,7 @@
 			}
 			case UMLPackage.CONTINUATION : {
 				Continuation continuation = (Continuation) theEObject;
-				Object result = caseContinuation(continuation);
+				T result = caseContinuation(continuation);
 				if (result == null)
 					result = caseInteractionFragment(continuation);
 				if (result == null)
@@ -3978,7 +3978,7 @@
 			}
 			case UMLPackage.CONSIDER_IGNORE_FRAGMENT : {
 				ConsiderIgnoreFragment considerIgnoreFragment = (ConsiderIgnoreFragment) theEObject;
-				Object result = caseConsiderIgnoreFragment(considerIgnoreFragment);
+				T result = caseConsiderIgnoreFragment(considerIgnoreFragment);
 				if (result == null)
 					result = caseCombinedFragment(considerIgnoreFragment);
 				if (result == null)
@@ -3995,7 +3995,7 @@
 			}
 			case UMLPackage.CREATE_OBJECT_ACTION : {
 				CreateObjectAction createObjectAction = (CreateObjectAction) theEObject;
-				Object result = caseCreateObjectAction(createObjectAction);
+				T result = caseCreateObjectAction(createObjectAction);
 				if (result == null)
 					result = caseAction(createObjectAction);
 				if (result == null)
@@ -4016,7 +4016,7 @@
 			}
 			case UMLPackage.DESTROY_OBJECT_ACTION : {
 				DestroyObjectAction destroyObjectAction = (DestroyObjectAction) theEObject;
-				Object result = caseDestroyObjectAction(destroyObjectAction);
+				T result = caseDestroyObjectAction(destroyObjectAction);
 				if (result == null)
 					result = caseAction(destroyObjectAction);
 				if (result == null)
@@ -4037,7 +4037,7 @@
 			}
 			case UMLPackage.TEST_IDENTITY_ACTION : {
 				TestIdentityAction testIdentityAction = (TestIdentityAction) theEObject;
-				Object result = caseTestIdentityAction(testIdentityAction);
+				T result = caseTestIdentityAction(testIdentityAction);
 				if (result == null)
 					result = caseAction(testIdentityAction);
 				if (result == null)
@@ -4058,7 +4058,7 @@
 			}
 			case UMLPackage.READ_SELF_ACTION : {
 				ReadSelfAction readSelfAction = (ReadSelfAction) theEObject;
-				Object result = caseReadSelfAction(readSelfAction);
+				T result = caseReadSelfAction(readSelfAction);
 				if (result == null)
 					result = caseAction(readSelfAction);
 				if (result == null)
@@ -4079,7 +4079,7 @@
 			}
 			case UMLPackage.STRUCTURAL_FEATURE_ACTION : {
 				StructuralFeatureAction structuralFeatureAction = (StructuralFeatureAction) theEObject;
-				Object result = caseStructuralFeatureAction(structuralFeatureAction);
+				T result = caseStructuralFeatureAction(structuralFeatureAction);
 				if (result == null)
 					result = caseAction(structuralFeatureAction);
 				if (result == null)
@@ -4100,7 +4100,7 @@
 			}
 			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION : {
 				ReadStructuralFeatureAction readStructuralFeatureAction = (ReadStructuralFeatureAction) theEObject;
-				Object result = caseReadStructuralFeatureAction(readStructuralFeatureAction);
+				T result = caseReadStructuralFeatureAction(readStructuralFeatureAction);
 				if (result == null)
 					result = caseStructuralFeatureAction(readStructuralFeatureAction);
 				if (result == null)
@@ -4123,7 +4123,7 @@
 			}
 			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION : {
 				WriteStructuralFeatureAction writeStructuralFeatureAction = (WriteStructuralFeatureAction) theEObject;
-				Object result = caseWriteStructuralFeatureAction(writeStructuralFeatureAction);
+				T result = caseWriteStructuralFeatureAction(writeStructuralFeatureAction);
 				if (result == null)
 					result = caseStructuralFeatureAction(writeStructuralFeatureAction);
 				if (result == null)
@@ -4146,7 +4146,7 @@
 			}
 			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION : {
 				ClearStructuralFeatureAction clearStructuralFeatureAction = (ClearStructuralFeatureAction) theEObject;
-				Object result = caseClearStructuralFeatureAction(clearStructuralFeatureAction);
+				T result = caseClearStructuralFeatureAction(clearStructuralFeatureAction);
 				if (result == null)
 					result = caseStructuralFeatureAction(clearStructuralFeatureAction);
 				if (result == null)
@@ -4169,7 +4169,7 @@
 			}
 			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION : {
 				RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = (RemoveStructuralFeatureValueAction) theEObject;
-				Object result = caseRemoveStructuralFeatureValueAction(removeStructuralFeatureValueAction);
+				T result = caseRemoveStructuralFeatureValueAction(removeStructuralFeatureValueAction);
 				if (result == null)
 					result = caseWriteStructuralFeatureAction(removeStructuralFeatureValueAction);
 				if (result == null)
@@ -4194,7 +4194,7 @@
 			}
 			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION : {
 				AddStructuralFeatureValueAction addStructuralFeatureValueAction = (AddStructuralFeatureValueAction) theEObject;
-				Object result = caseAddStructuralFeatureValueAction(addStructuralFeatureValueAction);
+				T result = caseAddStructuralFeatureValueAction(addStructuralFeatureValueAction);
 				if (result == null)
 					result = caseWriteStructuralFeatureAction(addStructuralFeatureValueAction);
 				if (result == null)
@@ -4219,7 +4219,7 @@
 			}
 			case UMLPackage.LINK_ACTION : {
 				LinkAction linkAction = (LinkAction) theEObject;
-				Object result = caseLinkAction(linkAction);
+				T result = caseLinkAction(linkAction);
 				if (result == null)
 					result = caseAction(linkAction);
 				if (result == null)
@@ -4240,7 +4240,7 @@
 			}
 			case UMLPackage.LINK_END_DATA : {
 				LinkEndData linkEndData = (LinkEndData) theEObject;
-				Object result = caseLinkEndData(linkEndData);
+				T result = caseLinkEndData(linkEndData);
 				if (result == null)
 					result = caseElement(linkEndData);
 				if (result == null)
@@ -4251,7 +4251,7 @@
 			}
 			case UMLPackage.QUALIFIER_VALUE : {
 				QualifierValue qualifierValue = (QualifierValue) theEObject;
-				Object result = caseQualifierValue(qualifierValue);
+				T result = caseQualifierValue(qualifierValue);
 				if (result == null)
 					result = caseElement(qualifierValue);
 				if (result == null)
@@ -4262,7 +4262,7 @@
 			}
 			case UMLPackage.READ_LINK_ACTION : {
 				ReadLinkAction readLinkAction = (ReadLinkAction) theEObject;
-				Object result = caseReadLinkAction(readLinkAction);
+				T result = caseReadLinkAction(readLinkAction);
 				if (result == null)
 					result = caseLinkAction(readLinkAction);
 				if (result == null)
@@ -4285,7 +4285,7 @@
 			}
 			case UMLPackage.LINK_END_CREATION_DATA : {
 				LinkEndCreationData linkEndCreationData = (LinkEndCreationData) theEObject;
-				Object result = caseLinkEndCreationData(linkEndCreationData);
+				T result = caseLinkEndCreationData(linkEndCreationData);
 				if (result == null)
 					result = caseLinkEndData(linkEndCreationData);
 				if (result == null)
@@ -4298,7 +4298,7 @@
 			}
 			case UMLPackage.CREATE_LINK_ACTION : {
 				CreateLinkAction createLinkAction = (CreateLinkAction) theEObject;
-				Object result = caseCreateLinkAction(createLinkAction);
+				T result = caseCreateLinkAction(createLinkAction);
 				if (result == null)
 					result = caseWriteLinkAction(createLinkAction);
 				if (result == null)
@@ -4323,7 +4323,7 @@
 			}
 			case UMLPackage.WRITE_LINK_ACTION : {
 				WriteLinkAction writeLinkAction = (WriteLinkAction) theEObject;
-				Object result = caseWriteLinkAction(writeLinkAction);
+				T result = caseWriteLinkAction(writeLinkAction);
 				if (result == null)
 					result = caseLinkAction(writeLinkAction);
 				if (result == null)
@@ -4346,7 +4346,7 @@
 			}
 			case UMLPackage.DESTROY_LINK_ACTION : {
 				DestroyLinkAction destroyLinkAction = (DestroyLinkAction) theEObject;
-				Object result = caseDestroyLinkAction(destroyLinkAction);
+				T result = caseDestroyLinkAction(destroyLinkAction);
 				if (result == null)
 					result = caseWriteLinkAction(destroyLinkAction);
 				if (result == null)
@@ -4371,7 +4371,7 @@
 			}
 			case UMLPackage.LINK_END_DESTRUCTION_DATA : {
 				LinkEndDestructionData linkEndDestructionData = (LinkEndDestructionData) theEObject;
-				Object result = caseLinkEndDestructionData(linkEndDestructionData);
+				T result = caseLinkEndDestructionData(linkEndDestructionData);
 				if (result == null)
 					result = caseLinkEndData(linkEndDestructionData);
 				if (result == null)
@@ -4384,7 +4384,7 @@
 			}
 			case UMLPackage.CLEAR_ASSOCIATION_ACTION : {
 				ClearAssociationAction clearAssociationAction = (ClearAssociationAction) theEObject;
-				Object result = caseClearAssociationAction(clearAssociationAction);
+				T result = caseClearAssociationAction(clearAssociationAction);
 				if (result == null)
 					result = caseAction(clearAssociationAction);
 				if (result == null)
@@ -4405,7 +4405,7 @@
 			}
 			case UMLPackage.BROADCAST_SIGNAL_ACTION : {
 				BroadcastSignalAction broadcastSignalAction = (BroadcastSignalAction) theEObject;
-				Object result = caseBroadcastSignalAction(broadcastSignalAction);
+				T result = caseBroadcastSignalAction(broadcastSignalAction);
 				if (result == null)
 					result = caseInvocationAction(broadcastSignalAction);
 				if (result == null)
@@ -4428,7 +4428,7 @@
 			}
 			case UMLPackage.SEND_OBJECT_ACTION : {
 				SendObjectAction sendObjectAction = (SendObjectAction) theEObject;
-				Object result = caseSendObjectAction(sendObjectAction);
+				T result = caseSendObjectAction(sendObjectAction);
 				if (result == null)
 					result = caseInvocationAction(sendObjectAction);
 				if (result == null)
@@ -4451,7 +4451,7 @@
 			}
 			case UMLPackage.VALUE_SPECIFICATION_ACTION : {
 				ValueSpecificationAction valueSpecificationAction = (ValueSpecificationAction) theEObject;
-				Object result = caseValueSpecificationAction(valueSpecificationAction);
+				T result = caseValueSpecificationAction(valueSpecificationAction);
 				if (result == null)
 					result = caseAction(valueSpecificationAction);
 				if (result == null)
@@ -4472,7 +4472,7 @@
 			}
 			case UMLPackage.TIME_EXPRESSION : {
 				TimeExpression timeExpression = (TimeExpression) theEObject;
-				Object result = caseTimeExpression(timeExpression);
+				T result = caseTimeExpression(timeExpression);
 				if (result == null)
 					result = caseValueSpecification(timeExpression);
 				if (result == null)
@@ -4493,7 +4493,7 @@
 			}
 			case UMLPackage.OBSERVATION : {
 				Observation observation = (Observation) theEObject;
-				Object result = caseObservation(observation);
+				T result = caseObservation(observation);
 				if (result == null)
 					result = casePackageableElement(observation);
 				if (result == null)
@@ -4510,7 +4510,7 @@
 			}
 			case UMLPackage.DURATION : {
 				Duration duration = (Duration) theEObject;
-				Object result = caseDuration(duration);
+				T result = caseDuration(duration);
 				if (result == null)
 					result = caseValueSpecification(duration);
 				if (result == null)
@@ -4531,7 +4531,7 @@
 			}
 			case UMLPackage.DURATION_INTERVAL : {
 				DurationInterval durationInterval = (DurationInterval) theEObject;
-				Object result = caseDurationInterval(durationInterval);
+				T result = caseDurationInterval(durationInterval);
 				if (result == null)
 					result = caseInterval(durationInterval);
 				if (result == null)
@@ -4554,7 +4554,7 @@
 			}
 			case UMLPackage.INTERVAL : {
 				Interval interval = (Interval) theEObject;
-				Object result = caseInterval(interval);
+				T result = caseInterval(interval);
 				if (result == null)
 					result = caseValueSpecification(interval);
 				if (result == null)
@@ -4575,7 +4575,7 @@
 			}
 			case UMLPackage.TIME_CONSTRAINT : {
 				TimeConstraint timeConstraint = (TimeConstraint) theEObject;
-				Object result = caseTimeConstraint(timeConstraint);
+				T result = caseTimeConstraint(timeConstraint);
 				if (result == null)
 					result = caseIntervalConstraint(timeConstraint);
 				if (result == null)
@@ -4596,7 +4596,7 @@
 			}
 			case UMLPackage.INTERVAL_CONSTRAINT : {
 				IntervalConstraint intervalConstraint = (IntervalConstraint) theEObject;
-				Object result = caseIntervalConstraint(intervalConstraint);
+				T result = caseIntervalConstraint(intervalConstraint);
 				if (result == null)
 					result = caseConstraint(intervalConstraint);
 				if (result == null)
@@ -4615,7 +4615,7 @@
 			}
 			case UMLPackage.TIME_INTERVAL : {
 				TimeInterval timeInterval = (TimeInterval) theEObject;
-				Object result = caseTimeInterval(timeInterval);
+				T result = caseTimeInterval(timeInterval);
 				if (result == null)
 					result = caseInterval(timeInterval);
 				if (result == null)
@@ -4638,7 +4638,7 @@
 			}
 			case UMLPackage.DURATION_CONSTRAINT : {
 				DurationConstraint durationConstraint = (DurationConstraint) theEObject;
-				Object result = caseDurationConstraint(durationConstraint);
+				T result = caseDurationConstraint(durationConstraint);
 				if (result == null)
 					result = caseIntervalConstraint(durationConstraint);
 				if (result == null)
@@ -4659,7 +4659,7 @@
 			}
 			case UMLPackage.TIME_OBSERVATION : {
 				TimeObservation timeObservation = (TimeObservation) theEObject;
-				Object result = caseTimeObservation(timeObservation);
+				T result = caseTimeObservation(timeObservation);
 				if (result == null)
 					result = caseObservation(timeObservation);
 				if (result == null)
@@ -4678,7 +4678,7 @@
 			}
 			case UMLPackage.DURATION_OBSERVATION : {
 				DurationObservation durationObservation = (DurationObservation) theEObject;
-				Object result = caseDurationObservation(durationObservation);
+				T result = caseDurationObservation(durationObservation);
 				if (result == null)
 					result = caseObservation(durationObservation);
 				if (result == null)
@@ -4697,7 +4697,7 @@
 			}
 			case UMLPackage.FINAL_STATE : {
 				FinalState finalState = (FinalState) theEObject;
-				Object result = caseFinalState(finalState);
+				T result = caseFinalState(finalState);
 				if (result == null)
 					result = caseState(finalState);
 				if (result == null)
@@ -4718,7 +4718,7 @@
 			}
 			case UMLPackage.TIME_EVENT : {
 				TimeEvent timeEvent = (TimeEvent) theEObject;
-				Object result = caseTimeEvent(timeEvent);
+				T result = caseTimeEvent(timeEvent);
 				if (result == null)
 					result = caseEvent(timeEvent);
 				if (result == null)
@@ -4737,7 +4737,7 @@
 			}
 			case UMLPackage.VARIABLE_ACTION : {
 				VariableAction variableAction = (VariableAction) theEObject;
-				Object result = caseVariableAction(variableAction);
+				T result = caseVariableAction(variableAction);
 				if (result == null)
 					result = caseAction(variableAction);
 				if (result == null)
@@ -4758,7 +4758,7 @@
 			}
 			case UMLPackage.READ_VARIABLE_ACTION : {
 				ReadVariableAction readVariableAction = (ReadVariableAction) theEObject;
-				Object result = caseReadVariableAction(readVariableAction);
+				T result = caseReadVariableAction(readVariableAction);
 				if (result == null)
 					result = caseVariableAction(readVariableAction);
 				if (result == null)
@@ -4781,7 +4781,7 @@
 			}
 			case UMLPackage.WRITE_VARIABLE_ACTION : {
 				WriteVariableAction writeVariableAction = (WriteVariableAction) theEObject;
-				Object result = caseWriteVariableAction(writeVariableAction);
+				T result = caseWriteVariableAction(writeVariableAction);
 				if (result == null)
 					result = caseVariableAction(writeVariableAction);
 				if (result == null)
@@ -4804,7 +4804,7 @@
 			}
 			case UMLPackage.CLEAR_VARIABLE_ACTION : {
 				ClearVariableAction clearVariableAction = (ClearVariableAction) theEObject;
-				Object result = caseClearVariableAction(clearVariableAction);
+				T result = caseClearVariableAction(clearVariableAction);
 				if (result == null)
 					result = caseVariableAction(clearVariableAction);
 				if (result == null)
@@ -4827,7 +4827,7 @@
 			}
 			case UMLPackage.ADD_VARIABLE_VALUE_ACTION : {
 				AddVariableValueAction addVariableValueAction = (AddVariableValueAction) theEObject;
-				Object result = caseAddVariableValueAction(addVariableValueAction);
+				T result = caseAddVariableValueAction(addVariableValueAction);
 				if (result == null)
 					result = caseWriteVariableAction(addVariableValueAction);
 				if (result == null)
@@ -4852,7 +4852,7 @@
 			}
 			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION : {
 				RemoveVariableValueAction removeVariableValueAction = (RemoveVariableValueAction) theEObject;
-				Object result = caseRemoveVariableValueAction(removeVariableValueAction);
+				T result = caseRemoveVariableValueAction(removeVariableValueAction);
 				if (result == null)
 					result = caseWriteVariableAction(removeVariableValueAction);
 				if (result == null)
@@ -4877,7 +4877,7 @@
 			}
 			case UMLPackage.RAISE_EXCEPTION_ACTION : {
 				RaiseExceptionAction raiseExceptionAction = (RaiseExceptionAction) theEObject;
-				Object result = caseRaiseExceptionAction(raiseExceptionAction);
+				T result = caseRaiseExceptionAction(raiseExceptionAction);
 				if (result == null)
 					result = caseAction(raiseExceptionAction);
 				if (result == null)
@@ -4898,7 +4898,7 @@
 			}
 			case UMLPackage.ACTION_INPUT_PIN : {
 				ActionInputPin actionInputPin = (ActionInputPin) theEObject;
-				Object result = caseActionInputPin(actionInputPin);
+				T result = caseActionInputPin(actionInputPin);
 				if (result == null)
 					result = caseInputPin(actionInputPin);
 				if (result == null)
@@ -4925,7 +4925,7 @@
 			}
 			case UMLPackage.INFORMATION_ITEM : {
 				InformationItem informationItem = (InformationItem) theEObject;
-				Object result = caseInformationItem(informationItem);
+				T result = caseInformationItem(informationItem);
 				if (result == null)
 					result = caseClassifier(informationItem);
 				if (result == null)
@@ -4952,7 +4952,7 @@
 			}
 			case UMLPackage.INFORMATION_FLOW : {
 				InformationFlow informationFlow = (InformationFlow) theEObject;
-				Object result = caseInformationFlow(informationFlow);
+				T result = caseInformationFlow(informationFlow);
 				if (result == null)
 					result = casePackageableElement(informationFlow);
 				if (result == null)
@@ -4973,7 +4973,7 @@
 			}
 			case UMLPackage.READ_EXTENT_ACTION : {
 				ReadExtentAction readExtentAction = (ReadExtentAction) theEObject;
-				Object result = caseReadExtentAction(readExtentAction);
+				T result = caseReadExtentAction(readExtentAction);
 				if (result == null)
 					result = caseAction(readExtentAction);
 				if (result == null)
@@ -4994,7 +4994,7 @@
 			}
 			case UMLPackage.RECLASSIFY_OBJECT_ACTION : {
 				ReclassifyObjectAction reclassifyObjectAction = (ReclassifyObjectAction) theEObject;
-				Object result = caseReclassifyObjectAction(reclassifyObjectAction);
+				T result = caseReclassifyObjectAction(reclassifyObjectAction);
 				if (result == null)
 					result = caseAction(reclassifyObjectAction);
 				if (result == null)
@@ -5015,7 +5015,7 @@
 			}
 			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION : {
 				ReadIsClassifiedObjectAction readIsClassifiedObjectAction = (ReadIsClassifiedObjectAction) theEObject;
-				Object result = caseReadIsClassifiedObjectAction(readIsClassifiedObjectAction);
+				T result = caseReadIsClassifiedObjectAction(readIsClassifiedObjectAction);
 				if (result == null)
 					result = caseAction(readIsClassifiedObjectAction);
 				if (result == null)
@@ -5036,7 +5036,7 @@
 			}
 			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION : {
 				StartClassifierBehaviorAction startClassifierBehaviorAction = (StartClassifierBehaviorAction) theEObject;
-				Object result = caseStartClassifierBehaviorAction(startClassifierBehaviorAction);
+				T result = caseStartClassifierBehaviorAction(startClassifierBehaviorAction);
 				if (result == null)
 					result = caseAction(startClassifierBehaviorAction);
 				if (result == null)
@@ -5057,7 +5057,7 @@
 			}
 			case UMLPackage.READ_LINK_OBJECT_END_ACTION : {
 				ReadLinkObjectEndAction readLinkObjectEndAction = (ReadLinkObjectEndAction) theEObject;
-				Object result = caseReadLinkObjectEndAction(readLinkObjectEndAction);
+				T result = caseReadLinkObjectEndAction(readLinkObjectEndAction);
 				if (result == null)
 					result = caseAction(readLinkObjectEndAction);
 				if (result == null)
@@ -5078,7 +5078,7 @@
 			}
 			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION : {
 				ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = (ReadLinkObjectEndQualifierAction) theEObject;
-				Object result = caseReadLinkObjectEndQualifierAction(readLinkObjectEndQualifierAction);
+				T result = caseReadLinkObjectEndQualifierAction(readLinkObjectEndQualifierAction);
 				if (result == null)
 					result = caseAction(readLinkObjectEndQualifierAction);
 				if (result == null)
@@ -5099,7 +5099,7 @@
 			}
 			case UMLPackage.CREATE_LINK_OBJECT_ACTION : {
 				CreateLinkObjectAction createLinkObjectAction = (CreateLinkObjectAction) theEObject;
-				Object result = caseCreateLinkObjectAction(createLinkObjectAction);
+				T result = caseCreateLinkObjectAction(createLinkObjectAction);
 				if (result == null)
 					result = caseCreateLinkAction(createLinkObjectAction);
 				if (result == null)
@@ -5126,7 +5126,7 @@
 			}
 			case UMLPackage.ACCEPT_EVENT_ACTION : {
 				AcceptEventAction acceptEventAction = (AcceptEventAction) theEObject;
-				Object result = caseAcceptEventAction(acceptEventAction);
+				T result = caseAcceptEventAction(acceptEventAction);
 				if (result == null)
 					result = caseAction(acceptEventAction);
 				if (result == null)
@@ -5147,7 +5147,7 @@
 			}
 			case UMLPackage.ACCEPT_CALL_ACTION : {
 				AcceptCallAction acceptCallAction = (AcceptCallAction) theEObject;
-				Object result = caseAcceptCallAction(acceptCallAction);
+				T result = caseAcceptCallAction(acceptCallAction);
 				if (result == null)
 					result = caseAcceptEventAction(acceptCallAction);
 				if (result == null)
@@ -5170,7 +5170,7 @@
 			}
 			case UMLPackage.REPLY_ACTION : {
 				ReplyAction replyAction = (ReplyAction) theEObject;
-				Object result = caseReplyAction(replyAction);
+				T result = caseReplyAction(replyAction);
 				if (result == null)
 					result = caseAction(replyAction);
 				if (result == null)
@@ -5191,7 +5191,7 @@
 			}
 			case UMLPackage.UNMARSHALL_ACTION : {
 				UnmarshallAction unmarshallAction = (UnmarshallAction) theEObject;
-				Object result = caseUnmarshallAction(unmarshallAction);
+				T result = caseUnmarshallAction(unmarshallAction);
 				if (result == null)
 					result = caseAction(unmarshallAction);
 				if (result == null)
@@ -5212,7 +5212,7 @@
 			}
 			case UMLPackage.REDUCE_ACTION : {
 				ReduceAction reduceAction = (ReduceAction) theEObject;
-				Object result = caseReduceAction(reduceAction);
+				T result = caseReduceAction(reduceAction);
 				if (result == null)
 					result = caseAction(reduceAction);
 				if (result == null)
@@ -5233,7 +5233,7 @@
 			}
 			case UMLPackage.JOIN_NODE : {
 				JoinNode joinNode = (JoinNode) theEObject;
-				Object result = caseJoinNode(joinNode);
+				T result = caseJoinNode(joinNode);
 				if (result == null)
 					result = caseControlNode(joinNode);
 				if (result == null)
@@ -5252,7 +5252,7 @@
 			}
 			case UMLPackage.DATA_STORE_NODE : {
 				DataStoreNode dataStoreNode = (DataStoreNode) theEObject;
-				Object result = caseDataStoreNode(dataStoreNode);
+				T result = caseDataStoreNode(dataStoreNode);
 				if (result == null)
 					result = caseCentralBufferNode(dataStoreNode);
 				if (result == null)
@@ -5275,7 +5275,7 @@
 			}
 			case UMLPackage.OBJECT_FLOW : {
 				ObjectFlow objectFlow = (ObjectFlow) theEObject;
-				Object result = caseObjectFlow(objectFlow);
+				T result = caseObjectFlow(objectFlow);
 				if (result == null)
 					result = caseActivityEdge(objectFlow);
 				if (result == null)
@@ -5292,7 +5292,7 @@
 			}
 			case UMLPackage.CONDITIONAL_NODE : {
 				ConditionalNode conditionalNode = (ConditionalNode) theEObject;
-				Object result = caseConditionalNode(conditionalNode);
+				T result = caseConditionalNode(conditionalNode);
 				if (result == null)
 					result = caseStructuredActivityNode(conditionalNode);
 				if (result == null)
@@ -5319,7 +5319,7 @@
 			}
 			case UMLPackage.CLAUSE : {
 				Clause clause = (Clause) theEObject;
-				Object result = caseClause(clause);
+				T result = caseClause(clause);
 				if (result == null)
 					result = caseElement(clause);
 				if (result == null)
@@ -5330,7 +5330,7 @@
 			}
 			case UMLPackage.LOOP_NODE : {
 				LoopNode loopNode = (LoopNode) theEObject;
-				Object result = caseLoopNode(loopNode);
+				T result = caseLoopNode(loopNode);
 				if (result == null)
 					result = caseStructuredActivityNode(loopNode);
 				if (result == null)
@@ -5357,7 +5357,7 @@
 			}
 			case UMLPackage.EXPANSION_NODE : {
 				ExpansionNode expansionNode = (ExpansionNode) theEObject;
-				Object result = caseExpansionNode(expansionNode);
+				T result = caseExpansionNode(expansionNode);
 				if (result == null)
 					result = caseObjectNode(expansionNode);
 				if (result == null)
@@ -5378,7 +5378,7 @@
 			}
 			case UMLPackage.EXPANSION_REGION : {
 				ExpansionRegion expansionRegion = (ExpansionRegion) theEObject;
-				Object result = caseExpansionRegion(expansionRegion);
+				T result = caseExpansionRegion(expansionRegion);
 				if (result == null)
 					result = caseStructuredActivityNode(expansionRegion);
 				if (result == null)
@@ -5405,7 +5405,7 @@
 			}
 			case UMLPackage.PROTOCOL_TRANSITION : {
 				ProtocolTransition protocolTransition = (ProtocolTransition) theEObject;
-				Object result = caseProtocolTransition(protocolTransition);
+				T result = caseProtocolTransition(protocolTransition);
 				if (result == null)
 					result = caseTransition(protocolTransition);
 				if (result == null)
@@ -5424,7 +5424,7 @@
 			}
 			case UMLPackage.ASSOCIATION_CLASS : {
 				AssociationClass associationClass = (AssociationClass) theEObject;
-				Object result = caseAssociationClass(associationClass);
+				T result = caseAssociationClass(associationClass);
 				if (result == null)
 					result = caseClass(associationClass);
 				if (result == null)
@@ -5477,7 +5477,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseComment(Comment object) {
+	public T caseComment(Comment object) {
 		return null;
 	}
 
@@ -5492,7 +5492,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseElement(Element object) {
+	public T caseElement(Element object) {
 		return null;
 	}
 
@@ -5507,7 +5507,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDirectedRelationship(DirectedRelationship object) {
+	public T caseDirectedRelationship(DirectedRelationship object) {
 		return null;
 	}
 
@@ -5522,7 +5522,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRelationship(Relationship object) {
+	public T caseRelationship(Relationship object) {
 		return null;
 	}
 
@@ -5537,7 +5537,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralSpecification(LiteralSpecification object) {
+	public T caseLiteralSpecification(LiteralSpecification object) {
 		return null;
 	}
 
@@ -5552,7 +5552,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseValueSpecification(ValueSpecification object) {
+	public T caseValueSpecification(ValueSpecification object) {
 		return null;
 	}
 
@@ -5567,7 +5567,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTypedElement(TypedElement object) {
+	public T caseTypedElement(TypedElement object) {
 		return null;
 	}
 
@@ -5582,7 +5582,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseNamedElement(NamedElement object) {
+	public T caseNamedElement(NamedElement object) {
 		return null;
 	}
 
@@ -5597,7 +5597,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDependency(Dependency object) {
+	public T caseDependency(Dependency object) {
 		return null;
 	}
 
@@ -5612,7 +5612,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePackageableElement(PackageableElement object) {
+	public T casePackageableElement(PackageableElement object) {
 		return null;
 	}
 
@@ -5627,7 +5627,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseParameterableElement(ParameterableElement object) {
+	public T caseParameterableElement(ParameterableElement object) {
 		return null;
 	}
 
@@ -5642,7 +5642,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTemplateParameter(TemplateParameter object) {
+	public T caseTemplateParameter(TemplateParameter object) {
 		return null;
 	}
 
@@ -5657,7 +5657,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTemplateSignature(TemplateSignature object) {
+	public T caseTemplateSignature(TemplateSignature object) {
 		return null;
 	}
 
@@ -5672,7 +5672,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTemplateableElement(TemplateableElement object) {
+	public T caseTemplateableElement(TemplateableElement object) {
 		return null;
 	}
 
@@ -5687,7 +5687,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTemplateBinding(TemplateBinding object) {
+	public T caseTemplateBinding(TemplateBinding object) {
 		return null;
 	}
 
@@ -5702,7 +5702,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTemplateParameterSubstitution(
+	public T caseTemplateParameterSubstitution(
 			TemplateParameterSubstitution object) {
 		return null;
 	}
@@ -5718,7 +5718,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseNamespace(Namespace object) {
+	public T caseNamespace(Namespace object) {
 		return null;
 	}
 
@@ -5733,7 +5733,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseElementImport(ElementImport object) {
+	public T caseElementImport(ElementImport object) {
 		return null;
 	}
 
@@ -5748,7 +5748,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePackageImport(PackageImport object) {
+	public T casePackageImport(PackageImport object) {
 		return null;
 	}
 
@@ -5763,7 +5763,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePackage(org.eclipse.uml2.uml.Package object) {
+	public T casePackage(org.eclipse.uml2.uml.Package object) {
 		return null;
 	}
 
@@ -5778,7 +5778,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePackageMerge(PackageMerge object) {
+	public T casePackageMerge(PackageMerge object) {
 		return null;
 	}
 
@@ -5793,7 +5793,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseType(Type object) {
+	public T caseType(Type object) {
 		return null;
 	}
 
@@ -5808,7 +5808,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProfileApplication(ProfileApplication object) {
+	public T caseProfileApplication(ProfileApplication object) {
 		return null;
 	}
 
@@ -5823,7 +5823,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProfile(Profile object) {
+	public T caseProfile(Profile object) {
 		return null;
 	}
 
@@ -5838,7 +5838,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStereotype(Stereotype object) {
+	public T caseStereotype(Stereotype object) {
 		return null;
 	}
 
@@ -5853,7 +5853,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClass(org.eclipse.uml2.uml.Class object) {
+	public T caseClass(org.eclipse.uml2.uml.Class object) {
 		return null;
 	}
 
@@ -5868,7 +5868,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseBehavioredClassifier(BehavioredClassifier object) {
+	public T caseBehavioredClassifier(BehavioredClassifier object) {
 		return null;
 	}
 
@@ -5883,7 +5883,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClassifier(Classifier object) {
+	public T caseClassifier(Classifier object) {
 		return null;
 	}
 
@@ -5898,7 +5898,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRedefinableElement(RedefinableElement object) {
+	public T caseRedefinableElement(RedefinableElement object) {
 		return null;
 	}
 
@@ -5913,7 +5913,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseGeneralization(Generalization object) {
+	public T caseGeneralization(Generalization object) {
 		return null;
 	}
 
@@ -5928,7 +5928,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseGeneralizationSet(GeneralizationSet object) {
+	public T caseGeneralizationSet(GeneralizationSet object) {
 		return null;
 	}
 
@@ -5943,7 +5943,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseFeature(Feature object) {
+	public T caseFeature(Feature object) {
 		return null;
 	}
 
@@ -5958,7 +5958,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseUseCase(UseCase object) {
+	public T caseUseCase(UseCase object) {
 		return null;
 	}
 
@@ -5973,7 +5973,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInclude(Include object) {
+	public T caseInclude(Include object) {
 		return null;
 	}
 
@@ -5988,7 +5988,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExtend(Extend object) {
+	public T caseExtend(Extend object) {
 		return null;
 	}
 
@@ -6003,7 +6003,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConstraint(Constraint object) {
+	public T caseConstraint(Constraint object) {
 		return null;
 	}
 
@@ -6018,7 +6018,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExtensionPoint(ExtensionPoint object) {
+	public T caseExtensionPoint(ExtensionPoint object) {
 		return null;
 	}
 
@@ -6033,7 +6033,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSubstitution(Substitution object) {
+	public T caseSubstitution(Substitution object) {
 		return null;
 	}
 
@@ -6048,7 +6048,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRealization(Realization object) {
+	public T caseRealization(Realization object) {
 		return null;
 	}
 
@@ -6063,7 +6063,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAbstraction(Abstraction object) {
+	public T caseAbstraction(Abstraction object) {
 		return null;
 	}
 
@@ -6078,7 +6078,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOpaqueExpression(OpaqueExpression object) {
+	public T caseOpaqueExpression(OpaqueExpression object) {
 		return null;
 	}
 
@@ -6093,7 +6093,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseParameter(Parameter object) {
+	public T caseParameter(Parameter object) {
 		return null;
 	}
 
@@ -6108,7 +6108,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMultiplicityElement(MultiplicityElement object) {
+	public T caseMultiplicityElement(MultiplicityElement object) {
 		return null;
 	}
 
@@ -6123,7 +6123,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConnectableElement(ConnectableElement object) {
+	public T caseConnectableElement(ConnectableElement object) {
 		return null;
 	}
 
@@ -6138,7 +6138,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConnectorEnd(ConnectorEnd object) {
+	public T caseConnectorEnd(ConnectorEnd object) {
 		return null;
 	}
 
@@ -6153,7 +6153,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProperty(Property object) {
+	public T caseProperty(Property object) {
 		return null;
 	}
 
@@ -6168,7 +6168,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDeploymentTarget(DeploymentTarget object) {
+	public T caseDeploymentTarget(DeploymentTarget object) {
 		return null;
 	}
 
@@ -6183,7 +6183,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDeployment(Deployment object) {
+	public T caseDeployment(Deployment object) {
 		return null;
 	}
 
@@ -6198,7 +6198,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDeployedArtifact(DeployedArtifact object) {
+	public T caseDeployedArtifact(DeployedArtifact object) {
 		return null;
 	}
 
@@ -6213,7 +6213,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDeploymentSpecification(DeploymentSpecification object) {
+	public T caseDeploymentSpecification(DeploymentSpecification object) {
 		return null;
 	}
 
@@ -6228,7 +6228,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseArtifact(Artifact object) {
+	public T caseArtifact(Artifact object) {
 		return null;
 	}
 
@@ -6243,7 +6243,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseManifestation(Manifestation object) {
+	public T caseManifestation(Manifestation object) {
 		return null;
 	}
 
@@ -6258,7 +6258,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOperation(Operation object) {
+	public T caseOperation(Operation object) {
 		return null;
 	}
 
@@ -6273,7 +6273,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseBehavioralFeature(BehavioralFeature object) {
+	public T caseBehavioralFeature(BehavioralFeature object) {
 		return null;
 	}
 
@@ -6288,7 +6288,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseBehavior(Behavior object) {
+	public T caseBehavior(Behavior object) {
 		return null;
 	}
 
@@ -6303,7 +6303,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseParameterSet(ParameterSet object) {
+	public T caseParameterSet(ParameterSet object) {
 		return null;
 	}
 
@@ -6318,7 +6318,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDataType(DataType object) {
+	public T caseDataType(DataType object) {
 		return null;
 	}
 
@@ -6333,7 +6333,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInterface(Interface object) {
+	public T caseInterface(Interface object) {
 		return null;
 	}
 
@@ -6348,7 +6348,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReception(Reception object) {
+	public T caseReception(Reception object) {
 		return null;
 	}
 
@@ -6363,7 +6363,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSignal(Signal object) {
+	public T caseSignal(Signal object) {
 		return null;
 	}
 
@@ -6378,7 +6378,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProtocolStateMachine(ProtocolStateMachine object) {
+	public T caseProtocolStateMachine(ProtocolStateMachine object) {
 		return null;
 	}
 
@@ -6393,7 +6393,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStateMachine(StateMachine object) {
+	public T caseStateMachine(StateMachine object) {
 		return null;
 	}
 
@@ -6408,7 +6408,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRegion(Region object) {
+	public T caseRegion(Region object) {
 		return null;
 	}
 
@@ -6423,7 +6423,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseVertex(Vertex object) {
+	public T caseVertex(Vertex object) {
 		return null;
 	}
 
@@ -6438,7 +6438,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTransition(Transition object) {
+	public T caseTransition(Transition object) {
 		return null;
 	}
 
@@ -6453,7 +6453,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTrigger(Trigger object) {
+	public T caseTrigger(Trigger object) {
 		return null;
 	}
 
@@ -6468,7 +6468,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseEvent(Event object) {
+	public T caseEvent(Event object) {
 		return null;
 	}
 
@@ -6483,7 +6483,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePort(Port object) {
+	public T casePort(Port object) {
 		return null;
 	}
 
@@ -6498,7 +6498,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseState(State object) {
+	public T caseState(State object) {
 		return null;
 	}
 
@@ -6513,7 +6513,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConnectionPointReference(ConnectionPointReference object) {
+	public T caseConnectionPointReference(ConnectionPointReference object) {
 		return null;
 	}
 
@@ -6528,7 +6528,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePseudostate(Pseudostate object) {
+	public T casePseudostate(Pseudostate object) {
 		return null;
 	}
 
@@ -6543,7 +6543,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProtocolConformance(ProtocolConformance object) {
+	public T caseProtocolConformance(ProtocolConformance object) {
 		return null;
 	}
 
@@ -6558,8 +6558,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOperationTemplateParameter(
-			OperationTemplateParameter object) {
+	public T caseOperationTemplateParameter(OperationTemplateParameter object) {
 		return null;
 	}
 
@@ -6574,7 +6573,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStructuralFeature(StructuralFeature object) {
+	public T caseStructuralFeature(StructuralFeature object) {
 		return null;
 	}
 
@@ -6589,7 +6588,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAssociation(Association object) {
+	public T caseAssociation(Association object) {
 		return null;
 	}
 
@@ -6604,7 +6603,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConnectableElementTemplateParameter(
+	public T caseConnectableElementTemplateParameter(
 			ConnectableElementTemplateParameter object) {
 		return null;
 	}
@@ -6620,7 +6619,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCollaborationUse(CollaborationUse object) {
+	public T caseCollaborationUse(CollaborationUse object) {
 		return null;
 	}
 
@@ -6635,7 +6634,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCollaboration(Collaboration object) {
+	public T caseCollaboration(Collaboration object) {
 		return null;
 	}
 
@@ -6650,7 +6649,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStructuredClassifier(StructuredClassifier object) {
+	public T caseStructuredClassifier(StructuredClassifier object) {
 		return null;
 	}
 
@@ -6665,7 +6664,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConnector(Connector object) {
+	public T caseConnector(Connector object) {
 		return null;
 	}
 
@@ -6680,7 +6679,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRedefinableTemplateSignature(
+	public T caseRedefinableTemplateSignature(
 			RedefinableTemplateSignature object) {
 		return null;
 	}
@@ -6696,8 +6695,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClassifierTemplateParameter(
-			ClassifierTemplateParameter object) {
+	public T caseClassifierTemplateParameter(ClassifierTemplateParameter object) {
 		return null;
 	}
 
@@ -6712,7 +6710,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInterfaceRealization(InterfaceRealization object) {
+	public T caseInterfaceRealization(InterfaceRealization object) {
 		return null;
 	}
 
@@ -6727,7 +6725,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseEncapsulatedClassifier(EncapsulatedClassifier object) {
+	public T caseEncapsulatedClassifier(EncapsulatedClassifier object) {
 		return null;
 	}
 
@@ -6742,7 +6740,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExtension(Extension object) {
+	public T caseExtension(Extension object) {
 		return null;
 	}
 
@@ -6757,7 +6755,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExtensionEnd(ExtensionEnd object) {
+	public T caseExtensionEnd(ExtensionEnd object) {
 		return null;
 	}
 
@@ -6772,7 +6770,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseImage(Image object) {
+	public T caseImage(Image object) {
 		return null;
 	}
 
@@ -6787,7 +6785,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStringExpression(StringExpression object) {
+	public T caseStringExpression(StringExpression object) {
 		return null;
 	}
 
@@ -6802,7 +6800,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExpression(Expression object) {
+	public T caseExpression(Expression object) {
 		return null;
 	}
 
@@ -6817,7 +6815,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralInteger(LiteralInteger object) {
+	public T caseLiteralInteger(LiteralInteger object) {
 		return null;
 	}
 
@@ -6832,7 +6830,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralString(LiteralString object) {
+	public T caseLiteralString(LiteralString object) {
 		return null;
 	}
 
@@ -6847,7 +6845,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralBoolean(LiteralBoolean object) {
+	public T caseLiteralBoolean(LiteralBoolean object) {
 		return null;
 	}
 
@@ -6862,7 +6860,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralNull(LiteralNull object) {
+	public T caseLiteralNull(LiteralNull object) {
 		return null;
 	}
 
@@ -6877,7 +6875,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSlot(Slot object) {
+	public T caseSlot(Slot object) {
 		return null;
 	}
 
@@ -6892,7 +6890,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInstanceSpecification(InstanceSpecification object) {
+	public T caseInstanceSpecification(InstanceSpecification object) {
 		return null;
 	}
 
@@ -6907,7 +6905,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseEnumeration(Enumeration object) {
+	public T caseEnumeration(Enumeration object) {
 		return null;
 	}
 
@@ -6922,7 +6920,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseEnumerationLiteral(EnumerationLiteral object) {
+	public T caseEnumerationLiteral(EnumerationLiteral object) {
 		return null;
 	}
 
@@ -6937,7 +6935,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePrimitiveType(PrimitiveType object) {
+	public T casePrimitiveType(PrimitiveType object) {
 		return null;
 	}
 
@@ -6952,7 +6950,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInstanceValue(InstanceValue object) {
+	public T caseInstanceValue(InstanceValue object) {
 		return null;
 	}
 
@@ -6967,7 +6965,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLiteralUnlimitedNatural(LiteralUnlimitedNatural object) {
+	public T caseLiteralUnlimitedNatural(LiteralUnlimitedNatural object) {
 		return null;
 	}
 
@@ -6982,7 +6980,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOpaqueBehavior(OpaqueBehavior object) {
+	public T caseOpaqueBehavior(OpaqueBehavior object) {
 		return null;
 	}
 
@@ -6997,7 +6995,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseFunctionBehavior(FunctionBehavior object) {
+	public T caseFunctionBehavior(FunctionBehavior object) {
 		return null;
 	}
 
@@ -7012,7 +7010,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActor(Actor object) {
+	public T caseActor(Actor object) {
 		return null;
 	}
 
@@ -7027,7 +7025,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseUsage(Usage object) {
+	public T caseUsage(Usage object) {
 		return null;
 	}
 
@@ -7042,7 +7040,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMessage(Message object) {
+	public T caseMessage(Message object) {
 		return null;
 	}
 
@@ -7057,7 +7055,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMessageEnd(MessageEnd object) {
+	public T caseMessageEnd(MessageEnd object) {
 		return null;
 	}
 
@@ -7072,7 +7070,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInteraction(Interaction object) {
+	public T caseInteraction(Interaction object) {
 		return null;
 	}
 
@@ -7087,7 +7085,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInteractionFragment(InteractionFragment object) {
+	public T caseInteractionFragment(InteractionFragment object) {
 		return null;
 	}
 
@@ -7102,7 +7100,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLifeline(Lifeline object) {
+	public T caseLifeline(Lifeline object) {
 		return null;
 	}
 
@@ -7117,7 +7115,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePartDecomposition(PartDecomposition object) {
+	public T casePartDecomposition(PartDecomposition object) {
 		return null;
 	}
 
@@ -7132,7 +7130,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInteractionUse(InteractionUse object) {
+	public T caseInteractionUse(InteractionUse object) {
 		return null;
 	}
 
@@ -7147,7 +7145,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseGate(Gate object) {
+	public T caseGate(Gate object) {
 		return null;
 	}
 
@@ -7162,7 +7160,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAction(Action object) {
+	public T caseAction(Action object) {
 		return null;
 	}
 
@@ -7177,7 +7175,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExecutableNode(ExecutableNode object) {
+	public T caseExecutableNode(ExecutableNode object) {
 		return null;
 	}
 
@@ -7192,7 +7190,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityNode(ActivityNode object) {
+	public T caseActivityNode(ActivityNode object) {
 		return null;
 	}
 
@@ -7207,7 +7205,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityEdge(ActivityEdge object) {
+	public T caseActivityEdge(ActivityEdge object) {
 		return null;
 	}
 
@@ -7222,7 +7220,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivity(Activity object) {
+	public T caseActivity(Activity object) {
 		return null;
 	}
 
@@ -7237,7 +7235,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityPartition(ActivityPartition object) {
+	public T caseActivityPartition(ActivityPartition object) {
 		return null;
 	}
 
@@ -7252,7 +7250,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityGroup(ActivityGroup object) {
+	public T caseActivityGroup(ActivityGroup object) {
 		return null;
 	}
 
@@ -7267,7 +7265,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStructuredActivityNode(StructuredActivityNode object) {
+	public T caseStructuredActivityNode(StructuredActivityNode object) {
 		return null;
 	}
 
@@ -7282,7 +7280,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseVariable(Variable object) {
+	public T caseVariable(Variable object) {
 		return null;
 	}
 
@@ -7297,8 +7295,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInterruptibleActivityRegion(
-			InterruptibleActivityRegion object) {
+	public T caseInterruptibleActivityRegion(InterruptibleActivityRegion object) {
 		return null;
 	}
 
@@ -7313,7 +7310,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExceptionHandler(ExceptionHandler object) {
+	public T caseExceptionHandler(ExceptionHandler object) {
 		return null;
 	}
 
@@ -7328,7 +7325,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseObjectNode(ObjectNode object) {
+	public T caseObjectNode(ObjectNode object) {
 		return null;
 	}
 
@@ -7343,7 +7340,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOutputPin(OutputPin object) {
+	public T caseOutputPin(OutputPin object) {
 		return null;
 	}
 
@@ -7358,7 +7355,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object casePin(Pin object) {
+	public T casePin(Pin object) {
 		return null;
 	}
 
@@ -7373,7 +7370,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInputPin(InputPin object) {
+	public T caseInputPin(InputPin object) {
 		return null;
 	}
 
@@ -7388,7 +7385,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseGeneralOrdering(GeneralOrdering object) {
+	public T caseGeneralOrdering(GeneralOrdering object) {
 		return null;
 	}
 
@@ -7403,7 +7400,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOccurrenceSpecification(OccurrenceSpecification object) {
+	public T caseOccurrenceSpecification(OccurrenceSpecification object) {
 		return null;
 	}
 
@@ -7418,7 +7415,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInteractionOperand(InteractionOperand object) {
+	public T caseInteractionOperand(InteractionOperand object) {
 		return null;
 	}
 
@@ -7433,7 +7430,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInteractionConstraint(InteractionConstraint object) {
+	public T caseInteractionConstraint(InteractionConstraint object) {
 		return null;
 	}
 
@@ -7448,7 +7445,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExecutionSpecification(ExecutionSpecification object) {
+	public T caseExecutionSpecification(ExecutionSpecification object) {
 		return null;
 	}
 
@@ -7463,7 +7460,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExecutionOccurrenceSpecification(
+	public T caseExecutionOccurrenceSpecification(
 			ExecutionOccurrenceSpecification object) {
 		return null;
 	}
@@ -7479,7 +7476,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExecutionEvent(ExecutionEvent object) {
+	public T caseExecutionEvent(ExecutionEvent object) {
 		return null;
 	}
 
@@ -7494,7 +7491,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStateInvariant(StateInvariant object) {
+	public T caseStateInvariant(StateInvariant object) {
 		return null;
 	}
 
@@ -7509,7 +7506,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActionExecutionSpecification(
+	public T caseActionExecutionSpecification(
 			ActionExecutionSpecification object) {
 		return null;
 	}
@@ -7525,7 +7522,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseBehaviorExecutionSpecification(
+	public T caseBehaviorExecutionSpecification(
 			BehaviorExecutionSpecification object) {
 		return null;
 	}
@@ -7541,7 +7538,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCreationEvent(CreationEvent object) {
+	public T caseCreationEvent(CreationEvent object) {
 		return null;
 	}
 
@@ -7556,7 +7553,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDestructionEvent(DestructionEvent object) {
+	public T caseDestructionEvent(DestructionEvent object) {
 		return null;
 	}
 
@@ -7571,7 +7568,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSendOperationEvent(SendOperationEvent object) {
+	public T caseSendOperationEvent(SendOperationEvent object) {
 		return null;
 	}
 
@@ -7586,7 +7583,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMessageEvent(MessageEvent object) {
+	public T caseMessageEvent(MessageEvent object) {
 		return null;
 	}
 
@@ -7601,7 +7598,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSendSignalEvent(SendSignalEvent object) {
+	public T caseSendSignalEvent(SendSignalEvent object) {
 		return null;
 	}
 
@@ -7616,7 +7613,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMessageOccurrenceSpecification(
+	public T caseMessageOccurrenceSpecification(
 			MessageOccurrenceSpecification object) {
 		return null;
 	}
@@ -7632,7 +7629,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReceiveOperationEvent(ReceiveOperationEvent object) {
+	public T caseReceiveOperationEvent(ReceiveOperationEvent object) {
 		return null;
 	}
 
@@ -7647,7 +7644,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReceiveSignalEvent(ReceiveSignalEvent object) {
+	public T caseReceiveSignalEvent(ReceiveSignalEvent object) {
 		return null;
 	}
 
@@ -7662,7 +7659,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCombinedFragment(CombinedFragment object) {
+	public T caseCombinedFragment(CombinedFragment object) {
 		return null;
 	}
 
@@ -7677,7 +7674,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseContinuation(Continuation object) {
+	public T caseContinuation(Continuation object) {
 		return null;
 	}
 
@@ -7692,7 +7689,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConsiderIgnoreFragment(ConsiderIgnoreFragment object) {
+	public T caseConsiderIgnoreFragment(ConsiderIgnoreFragment object) {
 		return null;
 	}
 
@@ -7707,7 +7704,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCallEvent(CallEvent object) {
+	public T caseCallEvent(CallEvent object) {
 		return null;
 	}
 
@@ -7722,7 +7719,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseChangeEvent(ChangeEvent object) {
+	public T caseChangeEvent(ChangeEvent object) {
 		return null;
 	}
 
@@ -7737,7 +7734,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSignalEvent(SignalEvent object) {
+	public T caseSignalEvent(SignalEvent object) {
 		return null;
 	}
 
@@ -7752,7 +7749,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAnyReceiveEvent(AnyReceiveEvent object) {
+	public T caseAnyReceiveEvent(AnyReceiveEvent object) {
 		return null;
 	}
 
@@ -7767,7 +7764,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCreateObjectAction(CreateObjectAction object) {
+	public T caseCreateObjectAction(CreateObjectAction object) {
 		return null;
 	}
 
@@ -7782,7 +7779,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDestroyObjectAction(DestroyObjectAction object) {
+	public T caseDestroyObjectAction(DestroyObjectAction object) {
 		return null;
 	}
 
@@ -7797,7 +7794,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTestIdentityAction(TestIdentityAction object) {
+	public T caseTestIdentityAction(TestIdentityAction object) {
 		return null;
 	}
 
@@ -7812,7 +7809,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadSelfAction(ReadSelfAction object) {
+	public T caseReadSelfAction(ReadSelfAction object) {
 		return null;
 	}
 
@@ -7827,7 +7824,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStructuralFeatureAction(StructuralFeatureAction object) {
+	public T caseStructuralFeatureAction(StructuralFeatureAction object) {
 		return null;
 	}
 
@@ -7842,8 +7839,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadStructuralFeatureAction(
-			ReadStructuralFeatureAction object) {
+	public T caseReadStructuralFeatureAction(ReadStructuralFeatureAction object) {
 		return null;
 	}
 
@@ -7858,7 +7854,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseWriteStructuralFeatureAction(
+	public T caseWriteStructuralFeatureAction(
 			WriteStructuralFeatureAction object) {
 		return null;
 	}
@@ -7874,7 +7870,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClearStructuralFeatureAction(
+	public T caseClearStructuralFeatureAction(
 			ClearStructuralFeatureAction object) {
 		return null;
 	}
@@ -7890,7 +7886,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRemoveStructuralFeatureValueAction(
+	public T caseRemoveStructuralFeatureValueAction(
 			RemoveStructuralFeatureValueAction object) {
 		return null;
 	}
@@ -7906,7 +7902,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAddStructuralFeatureValueAction(
+	public T caseAddStructuralFeatureValueAction(
 			AddStructuralFeatureValueAction object) {
 		return null;
 	}
@@ -7922,7 +7918,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLinkAction(LinkAction object) {
+	public T caseLinkAction(LinkAction object) {
 		return null;
 	}
 
@@ -7937,7 +7933,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLinkEndData(LinkEndData object) {
+	public T caseLinkEndData(LinkEndData object) {
 		return null;
 	}
 
@@ -7952,7 +7948,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseQualifierValue(QualifierValue object) {
+	public T caseQualifierValue(QualifierValue object) {
 		return null;
 	}
 
@@ -7967,7 +7963,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadLinkAction(ReadLinkAction object) {
+	public T caseReadLinkAction(ReadLinkAction object) {
 		return null;
 	}
 
@@ -7982,7 +7978,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLinkEndCreationData(LinkEndCreationData object) {
+	public T caseLinkEndCreationData(LinkEndCreationData object) {
 		return null;
 	}
 
@@ -7997,7 +7993,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCreateLinkAction(CreateLinkAction object) {
+	public T caseCreateLinkAction(CreateLinkAction object) {
 		return null;
 	}
 
@@ -8012,7 +8008,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseWriteLinkAction(WriteLinkAction object) {
+	public T caseWriteLinkAction(WriteLinkAction object) {
 		return null;
 	}
 
@@ -8027,7 +8023,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDestroyLinkAction(DestroyLinkAction object) {
+	public T caseDestroyLinkAction(DestroyLinkAction object) {
 		return null;
 	}
 
@@ -8042,7 +8038,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLinkEndDestructionData(LinkEndDestructionData object) {
+	public T caseLinkEndDestructionData(LinkEndDestructionData object) {
 		return null;
 	}
 
@@ -8057,7 +8053,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClearAssociationAction(ClearAssociationAction object) {
+	public T caseClearAssociationAction(ClearAssociationAction object) {
 		return null;
 	}
 
@@ -8072,7 +8068,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseBroadcastSignalAction(BroadcastSignalAction object) {
+	public T caseBroadcastSignalAction(BroadcastSignalAction object) {
 		return null;
 	}
 
@@ -8087,7 +8083,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInvocationAction(InvocationAction object) {
+	public T caseInvocationAction(InvocationAction object) {
 		return null;
 	}
 
@@ -8102,7 +8098,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSendObjectAction(SendObjectAction object) {
+	public T caseSendObjectAction(SendObjectAction object) {
 		return null;
 	}
 
@@ -8117,7 +8113,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseValueSpecificationAction(ValueSpecificationAction object) {
+	public T caseValueSpecificationAction(ValueSpecificationAction object) {
 		return null;
 	}
 
@@ -8132,7 +8128,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTimeExpression(TimeExpression object) {
+	public T caseTimeExpression(TimeExpression object) {
 		return null;
 	}
 
@@ -8147,7 +8143,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseObservation(Observation object) {
+	public T caseObservation(Observation object) {
 		return null;
 	}
 
@@ -8162,7 +8158,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDuration(Duration object) {
+	public T caseDuration(Duration object) {
 		return null;
 	}
 
@@ -8177,7 +8173,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseValuePin(ValuePin object) {
+	public T caseValuePin(ValuePin object) {
 		return null;
 	}
 
@@ -8192,7 +8188,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDurationInterval(DurationInterval object) {
+	public T caseDurationInterval(DurationInterval object) {
 		return null;
 	}
 
@@ -8207,7 +8203,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInterval(Interval object) {
+	public T caseInterval(Interval object) {
 		return null;
 	}
 
@@ -8222,7 +8218,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTimeConstraint(TimeConstraint object) {
+	public T caseTimeConstraint(TimeConstraint object) {
 		return null;
 	}
 
@@ -8237,7 +8233,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseIntervalConstraint(IntervalConstraint object) {
+	public T caseIntervalConstraint(IntervalConstraint object) {
 		return null;
 	}
 
@@ -8252,7 +8248,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTimeInterval(TimeInterval object) {
+	public T caseTimeInterval(TimeInterval object) {
 		return null;
 	}
 
@@ -8267,7 +8263,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDurationConstraint(DurationConstraint object) {
+	public T caseDurationConstraint(DurationConstraint object) {
 		return null;
 	}
 
@@ -8282,7 +8278,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTimeObservation(TimeObservation object) {
+	public T caseTimeObservation(TimeObservation object) {
 		return null;
 	}
 
@@ -8297,7 +8293,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDurationObservation(DurationObservation object) {
+	public T caseDurationObservation(DurationObservation object) {
 		return null;
 	}
 
@@ -8312,7 +8308,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseOpaqueAction(OpaqueAction object) {
+	public T caseOpaqueAction(OpaqueAction object) {
 		return null;
 	}
 
@@ -8327,7 +8323,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCallAction(CallAction object) {
+	public T caseCallAction(CallAction object) {
 		return null;
 	}
 
@@ -8342,7 +8338,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSendSignalAction(SendSignalAction object) {
+	public T caseSendSignalAction(SendSignalAction object) {
 		return null;
 	}
 
@@ -8357,7 +8353,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCallOperationAction(CallOperationAction object) {
+	public T caseCallOperationAction(CallOperationAction object) {
 		return null;
 	}
 
@@ -8372,7 +8368,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCallBehaviorAction(CallBehaviorAction object) {
+	public T caseCallBehaviorAction(CallBehaviorAction object) {
 		return null;
 	}
 
@@ -8387,7 +8383,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInformationItem(InformationItem object) {
+	public T caseInformationItem(InformationItem object) {
 		return null;
 	}
 
@@ -8402,7 +8398,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInformationFlow(InformationFlow object) {
+	public T caseInformationFlow(InformationFlow object) {
 		return null;
 	}
 
@@ -8417,7 +8413,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseModel(Model object) {
+	public T caseModel(Model object) {
 		return null;
 	}
 
@@ -8432,7 +8428,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseVariableAction(VariableAction object) {
+	public T caseVariableAction(VariableAction object) {
 		return null;
 	}
 
@@ -8447,7 +8443,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadVariableAction(ReadVariableAction object) {
+	public T caseReadVariableAction(ReadVariableAction object) {
 		return null;
 	}
 
@@ -8462,7 +8458,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseWriteVariableAction(WriteVariableAction object) {
+	public T caseWriteVariableAction(WriteVariableAction object) {
 		return null;
 	}
 
@@ -8477,7 +8473,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClearVariableAction(ClearVariableAction object) {
+	public T caseClearVariableAction(ClearVariableAction object) {
 		return null;
 	}
 
@@ -8492,7 +8488,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAddVariableValueAction(AddVariableValueAction object) {
+	public T caseAddVariableValueAction(AddVariableValueAction object) {
 		return null;
 	}
 
@@ -8507,7 +8503,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRemoveVariableValueAction(RemoveVariableValueAction object) {
+	public T caseRemoveVariableValueAction(RemoveVariableValueAction object) {
 		return null;
 	}
 
@@ -8522,7 +8518,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseRaiseExceptionAction(RaiseExceptionAction object) {
+	public T caseRaiseExceptionAction(RaiseExceptionAction object) {
 		return null;
 	}
 
@@ -8537,7 +8533,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActionInputPin(ActionInputPin object) {
+	public T caseActionInputPin(ActionInputPin object) {
 		return null;
 	}
 
@@ -8552,7 +8548,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadExtentAction(ReadExtentAction object) {
+	public T caseReadExtentAction(ReadExtentAction object) {
 		return null;
 	}
 
@@ -8567,7 +8563,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReclassifyObjectAction(ReclassifyObjectAction object) {
+	public T caseReclassifyObjectAction(ReclassifyObjectAction object) {
 		return null;
 	}
 
@@ -8582,7 +8578,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadIsClassifiedObjectAction(
+	public T caseReadIsClassifiedObjectAction(
 			ReadIsClassifiedObjectAction object) {
 		return null;
 	}
@@ -8598,7 +8594,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseStartClassifierBehaviorAction(
+	public T caseStartClassifierBehaviorAction(
 			StartClassifierBehaviorAction object) {
 		return null;
 	}
@@ -8614,7 +8610,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadLinkObjectEndAction(ReadLinkObjectEndAction object) {
+	public T caseReadLinkObjectEndAction(ReadLinkObjectEndAction object) {
 		return null;
 	}
 
@@ -8629,7 +8625,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReadLinkObjectEndQualifierAction(
+	public T caseReadLinkObjectEndQualifierAction(
 			ReadLinkObjectEndQualifierAction object) {
 		return null;
 	}
@@ -8645,7 +8641,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCreateLinkObjectAction(CreateLinkObjectAction object) {
+	public T caseCreateLinkObjectAction(CreateLinkObjectAction object) {
 		return null;
 	}
 
@@ -8660,7 +8656,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAcceptEventAction(AcceptEventAction object) {
+	public T caseAcceptEventAction(AcceptEventAction object) {
 		return null;
 	}
 
@@ -8675,7 +8671,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAcceptCallAction(AcceptCallAction object) {
+	public T caseAcceptCallAction(AcceptCallAction object) {
 		return null;
 	}
 
@@ -8690,7 +8686,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReplyAction(ReplyAction object) {
+	public T caseReplyAction(ReplyAction object) {
 		return null;
 	}
 
@@ -8705,7 +8701,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseUnmarshallAction(UnmarshallAction object) {
+	public T caseUnmarshallAction(UnmarshallAction object) {
 		return null;
 	}
 
@@ -8720,7 +8716,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseReduceAction(ReduceAction object) {
+	public T caseReduceAction(ReduceAction object) {
 		return null;
 	}
 
@@ -8735,7 +8731,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseControlNode(ControlNode object) {
+	public T caseControlNode(ControlNode object) {
 		return null;
 	}
 
@@ -8750,7 +8746,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseControlFlow(ControlFlow object) {
+	public T caseControlFlow(ControlFlow object) {
 		return null;
 	}
 
@@ -8765,7 +8761,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseInitialNode(InitialNode object) {
+	public T caseInitialNode(InitialNode object) {
 		return null;
 	}
 
@@ -8780,7 +8776,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityParameterNode(ActivityParameterNode object) {
+	public T caseActivityParameterNode(ActivityParameterNode object) {
 		return null;
 	}
 
@@ -8795,7 +8791,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseForkNode(ForkNode object) {
+	public T caseForkNode(ForkNode object) {
 		return null;
 	}
 
@@ -8810,7 +8806,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseFlowFinalNode(FlowFinalNode object) {
+	public T caseFlowFinalNode(FlowFinalNode object) {
 		return null;
 	}
 
@@ -8825,7 +8821,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseFinalNode(FinalNode object) {
+	public T caseFinalNode(FinalNode object) {
 		return null;
 	}
 
@@ -8840,7 +8836,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCentralBufferNode(CentralBufferNode object) {
+	public T caseCentralBufferNode(CentralBufferNode object) {
 		return null;
 	}
 
@@ -8855,7 +8851,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseMergeNode(MergeNode object) {
+	public T caseMergeNode(MergeNode object) {
 		return null;
 	}
 
@@ -8870,7 +8866,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDecisionNode(DecisionNode object) {
+	public T caseDecisionNode(DecisionNode object) {
 		return null;
 	}
 
@@ -8885,7 +8881,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseActivityFinalNode(ActivityFinalNode object) {
+	public T caseActivityFinalNode(ActivityFinalNode object) {
 		return null;
 	}
 
@@ -8900,7 +8896,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseJoinNode(JoinNode object) {
+	public T caseJoinNode(JoinNode object) {
 		return null;
 	}
 
@@ -8915,7 +8911,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDataStoreNode(DataStoreNode object) {
+	public T caseDataStoreNode(DataStoreNode object) {
 		return null;
 	}
 
@@ -8930,7 +8926,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseObjectFlow(ObjectFlow object) {
+	public T caseObjectFlow(ObjectFlow object) {
 		return null;
 	}
 
@@ -8945,7 +8941,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseSequenceNode(SequenceNode object) {
+	public T caseSequenceNode(SequenceNode object) {
 		return null;
 	}
 
@@ -8960,7 +8956,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseConditionalNode(ConditionalNode object) {
+	public T caseConditionalNode(ConditionalNode object) {
 		return null;
 	}
 
@@ -8975,7 +8971,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseClause(Clause object) {
+	public T caseClause(Clause object) {
 		return null;
 	}
 
@@ -8990,7 +8986,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseLoopNode(LoopNode object) {
+	public T caseLoopNode(LoopNode object) {
 		return null;
 	}
 
@@ -9005,7 +9001,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExpansionNode(ExpansionNode object) {
+	public T caseExpansionNode(ExpansionNode object) {
 		return null;
 	}
 
@@ -9020,7 +9016,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExpansionRegion(ExpansionRegion object) {
+	public T caseExpansionRegion(ExpansionRegion object) {
 		return null;
 	}
 
@@ -9035,7 +9031,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseComponentRealization(ComponentRealization object) {
+	public T caseComponentRealization(ComponentRealization object) {
 		return null;
 	}
 
@@ -9050,7 +9046,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseComponent(Component object) {
+	public T caseComponent(Component object) {
 		return null;
 	}
 
@@ -9065,7 +9061,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseNode(Node object) {
+	public T caseNode(Node object) {
 		return null;
 	}
 
@@ -9080,7 +9076,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseDevice(Device object) {
+	public T caseDevice(Device object) {
 		return null;
 	}
 
@@ -9095,7 +9091,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseExecutionEnvironment(ExecutionEnvironment object) {
+	public T caseExecutionEnvironment(ExecutionEnvironment object) {
 		return null;
 	}
 
@@ -9110,7 +9106,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseCommunicationPath(CommunicationPath object) {
+	public T caseCommunicationPath(CommunicationPath object) {
 		return null;
 	}
 
@@ -9125,7 +9121,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseFinalState(FinalState object) {
+	public T caseFinalState(FinalState object) {
 		return null;
 	}
 
@@ -9140,7 +9136,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseTimeEvent(TimeEvent object) {
+	public T caseTimeEvent(TimeEvent object) {
 		return null;
 	}
 
@@ -9155,7 +9151,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseProtocolTransition(ProtocolTransition object) {
+	public T caseProtocolTransition(ProtocolTransition object) {
 		return null;
 	}
 
@@ -9170,7 +9166,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseAssociationClass(AssociationClass object) {
+	public T caseAssociationClass(AssociationClass object) {
 		return null;
 	}
 
@@ -9185,7 +9181,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public Object caseEModelElement(EModelElement object) {
+	public T caseEModelElement(EModelElement object) {
 		return null;
 	}
 
@@ -9200,7 +9196,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
 	 * @generated
 	 */
-	public Object defaultCase(EObject object) {
+	public T defaultCase(EObject object) {
 		return 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 1a8e3d2..623bca6 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
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLUtil.java,v 1.42 2006/12/06 13:46:53 khussey Exp $
+ * $Id: UMLUtil.java,v 1.43 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.util;
 
@@ -31,6 +31,7 @@
 import org.eclipse.emf.common.util.ECollections;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.UniqueEList;
 import org.eclipse.emf.ecore.EAnnotation;
@@ -40,6 +41,7 @@
 import org.eclipse.emf.ecore.EDataType;
 import org.eclipse.emf.ecore.EEnum;
 import org.eclipse.emf.ecore.EEnumLiteral;
+import org.eclipse.emf.ecore.EGenericType;
 import org.eclipse.emf.ecore.EModelElement;
 import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.ecore.EObject;
@@ -124,11 +126,7 @@
 		 */
 		public static final QualifiedTextProvider DEFAULT = new QualifiedTextProvider();
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.common.util.UML2Util.QualifiedTextProvider#getText(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public String getText(EObject eObject) {
 
 			return eObject instanceof NamedElement
@@ -136,11 +134,7 @@
 				: super.getText(eObject);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.common.util.UML2Util.QualifiedTextProvider#getSeparator()
-		 */
+		@Override
 		public String getSeparator() {
 			return NamedElement.SEPARATOR;
 		}
@@ -154,6 +148,8 @@
 	public static class PackageMerger
 			extends EcoreUtil.Copier {
 
+		private static final long serialVersionUID = 1L;
+
 		protected class BodyMatcher
 				extends EStructuralFeatureMatcher {
 
@@ -173,10 +169,11 @@
 		protected class KeyMatcher
 				extends EClassMatcher {
 
-			protected KeyMatcher(BasicEMap.Entry entry) {
+			protected KeyMatcher(BasicEMap.Entry<String, String> entry) {
 				super((EObject) entry);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 				return super.matches(otherEObject)
 					&& safeEquals(((BasicEMap.Entry) eObject).getKey(),
@@ -191,6 +188,7 @@
 				super(eObject);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 				return super.matches(otherEObject)
 					&& safeEquals(getResultingQName(eObject),
@@ -205,6 +203,7 @@
 				super(valueSpecification);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 				return super.matches(otherEObject)
 					&& safeEquals(((ValueSpecification) eObject).stringValue(),
@@ -227,6 +226,7 @@
 				super(typedElement);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 
 				if (super.matches(otherEObject)) {
@@ -369,150 +369,113 @@
 
 		protected org.eclipse.uml2.uml.Package receivingPackage = null;
 
-		protected Collection mergedPackages = null;
+		protected Collection<org.eclipse.uml2.uml.Package> mergedPackages = null;
 
-		protected final Map resultingToMergedEObjectMap = new LinkedHashMap();
+		protected final Map<EObject, List<EObject>> resultingToMergedEObjectMap = new LinkedHashMap<EObject, List<EObject>>();
 
-		private final Map<EObject, EObject> copierMap = new LinkedHashMap();
+		private final Map<EObject, EObject> copierMap = new LinkedHashMap<EObject, EObject>();
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#clear()
-		 */
+		@Override
 		public void clear() {
 			copierMap.clear();
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#containsKey(java.lang.Object)
-		 */
+		@Override
 		public boolean containsKey(Object key) {
 			return copierMap.containsKey(key);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#containsValue(java.lang.Object)
-		 */
+		@Override
 		public boolean containsValue(Object value) {
 			return copierMap.containsValue(value);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#entrySet()
-		 */
-		public Set entrySet() {
+		@Override
+		public Set<Map.Entry<EObject, EObject>> entrySet() {
 			return copierMap.entrySet();
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#get(java.lang.Object)
-		 */
-		public EObject get(EObject key) {
+		@Override
+		public EObject get(Object key) {
 			return copierMap.get(key);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#isEmpty()
-		 */
+		@Override
 		public boolean isEmpty() {
 			return copierMap.isEmpty();
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#keySet()
-		 */
-		public Set keySet() {
+		@Override
+		public Set<EObject> keySet() {
 			return copierMap.keySet();
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#put(K, V)
-		 */
+		@Override
 		public EObject put(EObject key, EObject value) {
 			return copierMap.put(key, value);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#putAll(java.util.Map)
-		 */
-		public void putAll(Map t) {
+		@Override
+		public void putAll(Map<? extends EObject, ? extends EObject> t) {
 			copierMap.putAll(t);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#remove(java.lang.Object)
-		 */
-		public EObject remove(EObject key) {
+		@Override
+		public EObject remove(Object key) {
 			return copierMap.remove(key);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#size()
-		 */
+		@Override
 		public int size() {
 			return copierMap.size();
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.util.HashMap#values()
-		 */
-		public Collection values() {
+		@Override
+		public Collection<EObject> values() {
 			return copierMap.values();
 		}
 
-		protected List getMatchCandidates(EObject eObject) {
+		protected <EO extends EObject> List<EO> getMatchCandidates(EO eObject) {
 			Element baseElement = getBaseElement(eObject);
 
 			if (baseElement == null) {
 				EStructuralFeature eContainingFeature = eObject
 					.eContainingFeature();
 
-				return eContainingFeature.isMany()
-					? (List) ((EObject) get(eObject.eContainer()))
-						.eGet(eContainingFeature)
-					: Collections.singletonList(((EObject) get(eObject
-						.eContainer())).eGet(eContainingFeature));
+				if (eContainingFeature.isMany()) {
+					@SuppressWarnings("unchecked")
+					List<EO> values = (List<EO>) get(eObject.eContainer())
+						.eGet(eContainingFeature);
+					return values;
+				} else {
+					@SuppressWarnings("unchecked")
+					EO value = (EO) get(eObject.eContainer()).eGet(
+						eContainingFeature);
+					return Collections.<EO> singletonList(value);
+				}
 			} else {
-				return ((Element) get(baseElement)).getStereotypeApplications();
+				@SuppressWarnings("unchecked")
+				List<EO> stereotypeApplications = (List<EO>) ((Element) get(baseElement))
+					.getStereotypeApplications();
+				return stereotypeApplications;
 			}
 		}
 
-		protected List getMergedEObjects(EObject resultingEObject) {
-			Object mergedEObjects = resultingToMergedEObjectMap
+		protected <EO extends EObject> List<EO> getMergedEObjects(
+				EO resultingEObject) {
+			@SuppressWarnings("unchecked")
+			List<EO> mergedEObjects = (List<EO>) resultingToMergedEObjectMap
 				.get(resultingEObject);
 
 			return mergedEObjects == null
-				? Collections.singletonList(resultingEObject)
-				: (List) mergedEObjects;
+				? Collections.<EO> singletonList(resultingEObject)
+				: (List<EO>) mergedEObjects;
 		}
 
-		protected EObject getPreviouslyMergedEObject(EObject resultingEObject) {
-			List mergedEObjects = getMergedEObjects(resultingEObject);
-
-			return (EObject) mergedEObjects.get(mergedEObjects.size() - 1);
+		protected <EO extends EObject> EO getPreviouslyMergedEObject(
+				EO resultingEObject) {
+			List<EO> mergedEObjects = getMergedEObjects(resultingEObject);
+			return mergedEObjects.get(mergedEObjects.size() - 1);
 		}
 
 		protected String getResultingQName(EObject eObject) {
@@ -623,6 +586,7 @@
 				&& mergedStructuralFeature.isReadOnly());
 		}
 
+		@Override
 		protected void copyAttribute(EAttribute eAttribute, EObject eObject,
 				EObject copyEObject) {
 
@@ -679,19 +643,21 @@
 			}
 		}
 
+		@Override
 		protected void copyContainment(EReference eReference, EObject eObject,
 				EObject copyEObject) {
 
 			if (eObject != copyEObject) {
 
 				if (eReference.isMany()) {
-					InternalEList targetList = (InternalEList) copyEObject
+					@SuppressWarnings("unchecked")
+					List<EObject> sourceList = (List<EObject>) eObject
+						.eGet(eReference);
+					@SuppressWarnings("unchecked")
+					InternalEList<EObject> targetList = (InternalEList<EObject>) copyEObject
 						.eGet(getTarget(eReference));
 
-					for (Iterator i = ((List) eObject.eGet(eReference))
-						.iterator(); i.hasNext();) {
-
-						EObject childEObject = (EObject) i.next();
+					for (EObject childEObject : sourceList) {
 						EObject copyChildEObject = copy(childEObject);
 
 						if (childEObject != copyChildEObject) {
@@ -719,12 +685,10 @@
 			Type mergedType = mergedTypedElement.getType();
 
 			if (receivingType != null && mergedType instanceof Classifier) {
-				EList allParents = ((Classifier) mergedType).allParents();
+				EList<Classifier> allParents = ((Classifier) mergedType)
+					.allParents();
 
-				for (Iterator mergedEObjects = getMergedEObjects(receivingType)
-					.iterator(); mergedEObjects.hasNext();) {
-
-					EObject mergedEObject = (EObject) mergedEObjects.next();
+				for (EObject mergedEObject : getMergedEObjects(receivingType)) {
 
 					if (findEObject(allParents, new ResultingQNameMatcher(
 						mergedEObject)) != null) {
@@ -743,6 +707,7 @@
 				: resultingType);
 		}
 
+		@Override
 		protected void copyReference(EReference eReference, EObject eObject,
 				EObject copyEObject) {
 
@@ -752,17 +717,18 @@
 					mergeTypedElement_Type((TypedElement) copyEObject,
 						(TypedElement) eObject);
 				} else if (eReference.isMany()) {
-					InternalEList targetList = (InternalEList) copyEObject
+					@SuppressWarnings("unchecked")
+					List<EObject> sourceList = (List<EObject>) eObject
+						.eGet(eReference);
+					@SuppressWarnings("unchecked")
+					InternalEList<EObject> targetList = (InternalEList<EObject>) copyEObject
 						.eGet(getTarget(eReference));
 
 					boolean isBidirectional = eReference.getEOpposite() != null;
 					int index = 0;
 
-					for (Iterator i = ((List) eObject.eGet(eReference))
-						.iterator(); i.hasNext();) {
-
-						Object referencedEObject = i.next();
-						Object copyReferencedEObject = get(referencedEObject);
+					for (EObject referencedEObject : sourceList) {
+						EObject copyReferencedEObject = get(referencedEObject);
 
 						if (copyReferencedEObject == null) {
 
@@ -804,33 +770,34 @@
 			}
 		}
 
+		@Override
 		protected EObject createCopy(EObject eObject) {
-			return (EObject) new UMLSwitch() {
+			return new UMLSwitch<EObject>() {
 
-				public Object caseAssociation(Association association) {
-					Association matchingAssociation = (Association) findEObject(
+				@Override
+				public EObject caseAssociation(Association association) {
+					Association matchingAssociation = findEObject(
 						getMatchCandidates(association), new NameMatcher(
 							association) {
 
+							@Override
 							public boolean matches(EObject otherEObject) {
 
 								if (super.matches(otherEObject)) {
 									otherEObject = getPreviouslyMergedEObject(otherEObject);
 
-									List memberEnds = ((Association) eObject)
+									List<Property> memberEnds = ((Association) eObject)
 										.getMemberEnds();
-									List otherMemberEnds = ((Association) otherEObject)
+									List<Property> otherMemberEnds = ((Association) otherEObject)
 										.getMemberEnds();
 
 									if (memberEnds.size() == otherMemberEnds
 										.size()) {
 
-										for (Iterator i = memberEnds.iterator(); i
-											.hasNext();) {
+										for (Property memberEnd : memberEnds) {
 
 											if (findEObject(otherMemberEnds,
-												new TypeMatcher(
-													(TypedElement) i.next())) == null) {
+												new TypeMatcher(memberEnd)) == null) {
 
 												return false;
 											}
@@ -850,8 +817,9 @@
 						: matchingAssociation;
 				}
 
-				public Object caseClass(org.eclipse.uml2.uml.Class class_) {
-					org.eclipse.uml2.uml.Class matchingClass = (org.eclipse.uml2.uml.Class) findEObject(
+				@Override
+				public EObject caseClass(org.eclipse.uml2.uml.Class class_) {
+					org.eclipse.uml2.uml.Class matchingClass = findEObject(
 						getMatchCandidates(class_), new NameMatcher(class_));
 
 					return matchingClass == null
@@ -859,8 +827,9 @@
 						: matchingClass;
 				}
 
-				public Object caseComment(Comment comment) {
-					Comment matchingComment = (Comment) findEObject(
+				@Override
+				public EObject caseComment(Comment comment) {
+					Comment matchingComment = findEObject(
 						getMatchCandidates(comment), new BodyMatcher(comment));
 
 					return matchingComment == null
@@ -868,8 +837,9 @@
 						: matchingComment;
 				}
 
-				public Object caseConstraint(Constraint constraint) {
-					Constraint matchingConstraint = (Constraint) findEObject(
+				@Override
+				public EObject caseConstraint(Constraint constraint) {
+					Constraint matchingConstraint = findEObject(
 						getMatchCandidates(constraint), new NameMatcher(
 							constraint));
 
@@ -878,8 +848,9 @@
 						: matchingConstraint;
 				}
 
-				public Object caseDataType(DataType dataType) {
-					DataType matchingDataType = (DataType) findEObject(
+				@Override
+				public EObject caseDataType(DataType dataType) {
+					DataType matchingDataType = findEObject(
 						getMatchCandidates(dataType), new NameMatcher(dataType));
 
 					return matchingDataType == null
@@ -887,7 +858,8 @@
 						: matchingDataType;
 				}
 
-				public Object caseDirectedRelationship(
+				@Override
+				public EObject caseDirectedRelationship(
 						DirectedRelationship directedRelationship) {
 
 					if (mergedPackages.containsAll(directedRelationship
@@ -896,28 +868,28 @@
 						return directedRelationship;
 					}
 
-					DirectedRelationship matchingDirectedRelationship = (DirectedRelationship) findEObject(
+					DirectedRelationship matchingDirectedRelationship = findEObject(
 						getMatchCandidates(directedRelationship),
 						new EClassMatcher(directedRelationship) {
 
+							@Override
 							public boolean matches(EObject otherEObject) {
 
 								if (super.matches(otherEObject)) {
 									otherEObject = getPreviouslyMergedEObject(otherEObject);
 
-									List targets = ((DirectedRelationship) eObject)
+									List<Element> targets = ((DirectedRelationship) eObject)
 										.getTargets();
-									List otherTargets = ((DirectedRelationship) otherEObject)
+									List<Element> otherTargets = ((DirectedRelationship) otherEObject)
 										.getTargets();
 
 									if (targets.size() == otherTargets.size()) {
 
-										for (Iterator i = targets.iterator(); i
-											.hasNext();) {
+										for (Element target : targets) {
 
 											if (findEObject(otherTargets,
 												new ResultingQNameMatcher(
-													(EObject) i.next())) == null) {
+													target)) == null) {
 
 												return false;
 											}
@@ -936,9 +908,10 @@
 						: matchingDirectedRelationship;
 				}
 
-				public Object caseEnumerationLiteral(
+				@Override
+				public EObject caseEnumerationLiteral(
 						EnumerationLiteral enumerationLiteral) {
-					EnumerationLiteral matchingEnumerationLiteral = (EnumerationLiteral) findEObject(
+					EnumerationLiteral matchingEnumerationLiteral = findEObject(
 						getMatchCandidates(enumerationLiteral),
 						new NameMatcher(enumerationLiteral));
 
@@ -947,19 +920,21 @@
 						: matchingEnumerationLiteral;
 				}
 
-				public Object caseOperation(Operation operation) {
-					Operation matchingOperation = (Operation) findEObject(
+				@Override
+				public EObject caseOperation(Operation operation) {
+					Operation matchingOperation = findEObject(
 						getMatchCandidates(operation), new NameMatcher(
 							operation) {
 
+							@Override
 							public boolean matches(EObject otherEObject) {
 
 								if (super.matches(otherEObject)) {
 									otherEObject = getPreviouslyMergedEObject(otherEObject);
 
-									List ownedParameters = ((Operation) eObject)
+									List<Parameter> ownedParameters = ((Operation) eObject)
 										.getOwnedParameters();
-									List otherOwnedParameters = ((Operation) otherEObject)
+									List<Parameter> otherOwnedParameters = ((Operation) otherEObject)
 										.getOwnedParameters();
 
 									if (ownedParameters.size() == otherOwnedParameters
@@ -969,9 +944,8 @@
 											.size(); i++) {
 
 											if (!new TypeMatcher(
-												(TypedElement) ownedParameters
-													.get(i))
-												.matches((EObject) otherOwnedParameters
+												ownedParameters.get(i))
+												.matches(otherOwnedParameters
 													.get(i))) {
 
 												return false;
@@ -991,13 +965,14 @@
 						: matchingOperation;
 				}
 
-				public Object casePackage(org.eclipse.uml2.uml.Package package_) {
+				@Override
+				public EObject casePackage(org.eclipse.uml2.uml.Package package_) {
 					org.eclipse.uml2.uml.Package matchingPackage = null;
 
 					if (mergedPackages.contains(package_)) {
 						matchingPackage = receivingPackage;
 					} else {
-						matchingPackage = (org.eclipse.uml2.uml.Package) findEObject(
+						matchingPackage = findEObject(
 							getMatchCandidates(package_), new NameMatcher(
 								package_));
 					}
@@ -1007,8 +982,9 @@
 						: matchingPackage;
 				}
 
-				public Object caseParameter(Parameter parameter) {
-					Parameter matchingParameter = (Parameter) findEObject(
+				@Override
+				public EObject caseParameter(Parameter parameter) {
+					Parameter matchingParameter = findEObject(
 						getMatchCandidates(parameter), new NameMatcher(
 							parameter));
 
@@ -1017,8 +993,9 @@
 						: matchingParameter;
 				}
 
-				public Object caseProperty(Property property) {
-					Property matchingProperty = (Property) findEObject(
+				@Override
+				public EObject caseProperty(Property property) {
+					Property matchingProperty = findEObject(
 						getMatchCandidates(property), new NameMatcher(property));
 
 					return matchingProperty == null
@@ -1026,7 +1003,8 @@
 						: matchingProperty;
 				}
 
-				public Object defaultCase(EObject eObject) {
+				@Override
+				public EObject defaultCase(EObject eObject) {
 					Element baseElement = getBaseElement(eObject);
 
 					return baseElement == null
@@ -1035,12 +1013,13 @@
 							getTarget(eObject.eClass()));
 				}
 
-				protected Object doSwitch(EClass theEClass, EObject theEObject) {
+				@Override
+				protected EObject doSwitch(EClass theEClass, EObject theEObject) {
 
 					if (theEClass.eContainer() != modelPackage) {
 
 						if (theEClass == EcorePackage.Literals.EANNOTATION) {
-							EAnnotation matchingEAnnotation = (EAnnotation) findEObject(
+							EAnnotation matchingEAnnotation = findEObject(
 								getMatchCandidates(theEObject),
 								new SourceMatcher((EAnnotation) theEObject));
 
@@ -1048,12 +1027,14 @@
 								return matchingEAnnotation;
 							}
 						} else if (theEClass == EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY) {
-							BasicEMap.Entry matchingEntry = (BasicEMap.Entry) findEObject(
-								getMatchCandidates(theEObject), new KeyMatcher(
-									(BasicEMap.Entry) theEObject));
+							@SuppressWarnings("unchecked")
+							BasicEMap.Entry<String, String> matchingEntry = findEObject(
+								getMatchCandidates(theEObject),
+								new KeyMatcher(
+									(BasicEMap.Entry<String, String>) theEObject));
 
 							if (matchingEntry != null) {
-								return matchingEntry;
+								return (EObject) matchingEntry;
 							}
 						} else if (getStereotype(theEClass) != null) {
 							EObject matchingEObject = findEObject(
@@ -1071,21 +1052,20 @@
 			}.doSwitch(eObject);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreUtil.Copier#copy(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public EObject copy(EObject eObject) {
 			EObject copyEObject = super.copy(eObject);
 
 			if (eObject != copyEObject) {
-				List mergedEObjects = (List) resultingToMergedEObjectMap
+				List<EObject> mergedEObjects = resultingToMergedEObjectMap
 					.get(copyEObject);
 
 				if (mergedEObjects == null) {
-					resultingToMergedEObjectMap.put(copyEObject,
-						mergedEObjects = new UniqueEList.FastCompare(1));
+					resultingToMergedEObjectMap
+						.put(
+							copyEObject,
+							mergedEObjects = new UniqueEList.FastCompare<EObject>(
+								1));
 				}
 
 				mergedEObjects.add(eObject);
@@ -1099,26 +1079,26 @@
 			return copyEObject;
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreUtil.Copier#copyAll(java.util.Collection)
-		 */
-		public Collection copyAll(Collection eObjects) {
-			Collection result = new ArrayList(eObjects.size());
+		@Override
+		public <T> Collection<T> copyAll(Collection<? extends T> eObjects) {
+			Collection<T> result = new ArrayList<T>(eObjects.size());
 
-			for (Iterator o = eObjects.iterator(); o.hasNext();) {
-				EObject eObject = (EObject) o.next();
-				result.add(copy(eObject));
+			for (Object object : eObjects) {
+				@SuppressWarnings("unchecked")
+				T copy = (T) copy((EObject) object);
+				result.add(copy);
 
-				for (Iterator eAllContents = eObject.eAllContents(); eAllContents
-					.hasNext();) {
+				for (TreeIterator<EObject> eAllContents = ((EObject) object)
+					.eAllContents(); eAllContents.hasNext();) {
 
-					EObject childEObject = (EObject) eAllContents.next();
+					EObject childEObject = eAllContents.next();
 
 					if (childEObject instanceof Element) {
-						result.addAll(super.copyAll(((Element) childEObject)
-							.getStereotypeApplications()));
+						@SuppressWarnings("unchecked")
+						Collection<T> copies = (Collection<T>) super
+							.copyAll(((Element) childEObject)
+								.getStereotypeApplications());
+						result.addAll(copies);
 					}
 				}
 			}
@@ -1126,20 +1106,19 @@
 			return result;
 		}
 
-		protected Collection getAllMergedPackages(
+		protected Collection<org.eclipse.uml2.uml.Package> getAllMergedPackages(
 				org.eclipse.uml2.uml.Package package_) {
-			return getAllMergedPackages(package_, new UniqueEList.FastCompare());
+			return getAllMergedPackages(package_,
+				new UniqueEList.FastCompare<org.eclipse.uml2.uml.Package>());
 		}
 
-		private Collection getAllMergedPackages(
+		private Collection<org.eclipse.uml2.uml.Package> getAllMergedPackages(
 				org.eclipse.uml2.uml.Package package_,
-				Collection allMergedPackages) {
+				Collection<org.eclipse.uml2.uml.Package> allMergedPackages) {
 
-			for (Iterator packageMerges = package_.getPackageMerges()
-				.iterator(); packageMerges.hasNext();) {
-
-				org.eclipse.uml2.uml.Package mergedPackage = ((PackageMerge) packageMerges
-					.next()).getMergedPackage();
+			for (PackageMerge packageMerge : package_.getPackageMerges()) {
+				org.eclipse.uml2.uml.Package mergedPackage = packageMerge
+					.getMergedPackage();
 
 				if (mergedPackage != null) {
 					getAllMergedPackages(mergedPackage, allMergedPackages);
@@ -1151,29 +1130,24 @@
 			return allMergedPackages;
 		}
 
-		protected void processDifferentPropertyStaticity(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processDifferentPropertyStaticity(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator entries = resultingToMergedEObjectMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Object key = entry.getKey();
+			for (Map.Entry<EObject, List<EObject>> entry : resultingToMergedEObjectMap
+				.entrySet()) {
+				EObject key = entry.getKey();
 
 				if (key instanceof Property) {
 					Property property = (Property) key;
 
-					for (Iterator mergedProperties = ((List) entry.getValue())
-						.iterator(); mergedProperties.hasNext();) {
-
-						Property mergedProperty = (Property) mergedProperties
-							.next();
+					for (EObject mergedProperty : entry.getValue()) {
 
 						if (OPTION__REPORT.equals(options
 							.get(OPTION__DIFFERENT_PROPERTY_STATICITY))
 							&& diagnostics != null) {
 
-							if (property.isStatic() != mergedProperty
+							if (property.isStatic() != ((Property) mergedProperty)
 								.isStatic()) {
 
 								diagnostics
@@ -1195,29 +1169,24 @@
 			}
 		}
 
-		protected void processDifferentPropertyUniqueness(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processDifferentPropertyUniqueness(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator entries = resultingToMergedEObjectMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Object key = entry.getKey();
+			for (Map.Entry<EObject, List<EObject>> entry : resultingToMergedEObjectMap
+				.entrySet()) {
+				EObject key = entry.getKey();
 
 				if (key instanceof Property) {
 					Property property = (Property) key;
 
-					for (Iterator mergedProperties = ((List) entry.getValue())
-						.iterator(); mergedProperties.hasNext();) {
-
-						Property mergedProperty = (Property) mergedProperties
-							.next();
+					for (EObject mergedProperty : entry.getValue()) {
 
 						if (OPTION__REPORT.equals(options
 							.get(OPTION__DIFFERENT_PROPERTY_UNIQUENESS))
 							&& diagnostics != null) {
 
-							if (property.isUnique() != mergedProperty
+							if (property.isUnique() != ((Property) mergedProperty)
 								.isUnique()) {
 
 								diagnostics
@@ -1239,26 +1208,21 @@
 			}
 		}
 
-		protected void processImplicitRedefinitions(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processImplicitRedefinitions(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator resultingEObjects = resultingToMergedEObjectMap
-				.keySet().iterator(); resultingEObjects.hasNext();) {
-
-				EObject resultingEObject = (EObject) resultingEObjects.next();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Feature) {
 					Feature redefiningFeature = (Feature) resultingEObject;
-					List redefinedFeatures = getRedefinedFeatures(redefiningFeature);
+					EList<Feature> redefinedFeatures = getRedefinedFeatures(redefiningFeature);
 
-					for (Iterator validRedefinitions = findValidRedefinitions(
-						redefiningFeature, redefiningFeature.getName())
-						.iterator(); validRedefinitions.hasNext();) {
+					for (Feature validRedefinition : findValidRedefinitions(
+						redefiningFeature, redefiningFeature.getName())) {
 
-						Feature redefinedFeature = (Feature) validRedefinitions
-							.next();
-
-						if (!redefinedFeatures.contains(redefinedFeature)) {
+						if (!redefinedFeatures.contains(validRedefinition)) {
 
 							if (OPTION__PROCESS.equals(options
 								.get(OPTION__IMPLICIT_REDEFINITIONS))) {
@@ -1275,12 +1239,12 @@
 													getMessageSubstitutions(
 														context,
 														redefiningFeature,
-														redefinedFeature)),
+														validRedefinition)),
 											new Object[]{redefiningFeature,
-												redefinedFeature}));
+												validRedefinition}));
 								}
 
-								redefinedFeatures.add(redefinedFeature);
+								redefinedFeatures.add(validRedefinition);
 							} else if (OPTION__REPORT.equals(options
 								.get(OPTION__IMPLICIT_REDEFINITIONS))
 								&& diagnostics != null) {
@@ -1295,9 +1259,9 @@
 												"_UI_PackageMerger_ReportImplicitFeatureRedefinition_diagnostic", //$NON-NLS-1$
 												getMessageSubstitutions(
 													context, redefiningFeature,
-													redefinedFeature)),
+													validRedefinition)),
 										new Object[]{redefiningFeature,
-											redefinedFeature}));
+											validRedefinition}));
 							}
 						}
 					}
@@ -1305,22 +1269,18 @@
 			}
 		}
 
-		protected void processInvalidRedefinitions(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processInvalidRedefinitions(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator resultingEObjects = resultingToMergedEObjectMap
-				.keySet().iterator(); resultingEObjects.hasNext();) {
-
-				EObject resultingEObject = (EObject) resultingEObjects.next();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Feature) {
 					Feature redefiningFeature = (Feature) resultingEObject;
-					List redefinedFeatures = getRedefinedFeatures(redefiningFeature);
+					EList<Feature> redefinedFeatures = getRedefinedFeatures(redefiningFeature);
 
-					for (Iterator i = new ArrayList(redefinedFeatures)
-						.iterator(); i.hasNext();) {
-
-						Feature redefinedFeature = (Feature) i.next();
+					for (Feature redefinedFeature : new ArrayList<Feature>(
+						redefinedFeatures)) {
 
 						if (!UMLUtil.isRedefinitionValid(redefiningFeature,
 							redefinedFeature)) {
@@ -1371,16 +1331,12 @@
 						if (OPTION__PROCESS.equals(options
 							.get(OPTION__INVALID_REDEFINITIONS))) {
 
-							Collection validRedefinitions = findValidRedefinitions(
+							Collection<Feature> validRedefinitions = findValidRedefinitions(
 								redefiningFeature, redefinedFeature.getName());
 
 							if (!validRedefinitions.isEmpty()) {
 
-								for (Iterator j = validRedefinitions.iterator(); j
-									.hasNext();) {
-
-									Feature validRedefinition = (Feature) j
-										.next();
+								for (Feature validRedefinition : validRedefinitions) {
 
 									if (!redefinedFeatures
 										.contains(validRedefinition)) {
@@ -1421,23 +1377,19 @@
 			}
 		}
 
-		protected void processInvalidSubsets(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processInvalidSubsets(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator resultingEObjects = resultingToMergedEObjectMap
-				.keySet().iterator(); resultingEObjects.hasNext();) {
-
-				EObject resultingEObject = (EObject) resultingEObjects.next();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Property) {
 					Property subsettingProperty = (Property) resultingEObject;
-					List subsettedProperties = subsettingProperty
+					EList<Property> subsettedProperties = subsettingProperty
 						.getSubsettedProperties();
 
-					for (Iterator i = new ArrayList(subsettedProperties)
-						.iterator(); i.hasNext();) {
-
-						Property subsettedProperty = (Property) i.next();
+					for (Property subsettedProperty : new ArrayList<Property>(
+						subsettedProperties)) {
 
 						if (!UMLUtil.isSubsetValid(subsettingProperty,
 							subsettedProperty)) {
@@ -1489,15 +1441,12 @@
 						if (OPTION__PROCESS.equals(options
 							.get(OPTION__INVALID_SUBSETS))) {
 
-							Collection validSubsets = findValidSubsets(
+							Collection<Property> validSubsets = findValidSubsets(
 								subsettingProperty, subsettedProperty.getName());
 
 							if (!validSubsets.isEmpty()) {
 
-								for (Iterator j = validSubsets.iterator(); j
-									.hasNext();) {
-
-									Property validSubset = (Property) j.next();
+								for (Property validSubset : validSubsets) {
 
 									if (!subsettedProperties
 										.contains(validSubset)) {
@@ -1536,14 +1485,12 @@
 			}
 		}
 
-		protected void processEmptyUnions(Map options,
-				DiagnosticChain diagnostics, Map context) {
-			Map unionToSubsettingPropertyMap = new LinkedHashMap();
+		protected void processEmptyUnions(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
+			Map<Property, EList<Property>> unionToSubsettingPropertyMap = new LinkedHashMap<Property, EList<Property>>();
 
-			for (Iterator resultingEObjects = resultingToMergedEObjectMap
-				.keySet().iterator(); resultingEObjects.hasNext();) {
-
-				EObject resultingEObject = (EObject) resultingEObjects.next();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Property) {
 					Property property = (Property) resultingEObject;
@@ -1552,25 +1499,21 @@
 						&& !unionToSubsettingPropertyMap.containsKey(property)) {
 
 						unionToSubsettingPropertyMap.put(property,
-							new UniqueEList.FastCompare());
+							new UniqueEList.FastCompare<Property>());
 					}
 
-					for (Iterator subsettedProperties = property
-						.getSubsettedProperties().iterator(); subsettedProperties
-						.hasNext();) {
-
-						Property subsettedProperty = (Property) subsettedProperties
-							.next();
+					for (Property subsettedProperty : property
+						.getSubsettedProperties()) {
 
 						if (subsettedProperty.isDerivedUnion()) {
-							List subsettingProperties = (List) unionToSubsettingPropertyMap
+							EList<Property> subsettingProperties = unionToSubsettingPropertyMap
 								.get(subsettedProperty);
 
 							if (subsettingProperties == null) {
 								unionToSubsettingPropertyMap
 									.put(
 										subsettedProperty,
-										subsettingProperties = new UniqueEList.FastCompare());
+										subsettingProperties = new UniqueEList.FastCompare<Property>());
 							}
 
 							subsettingProperties.add(property);
@@ -1579,13 +1522,11 @@
 				}
 			}
 
-			for (Iterator entries = unionToSubsettingPropertyMap.entrySet()
-				.iterator(); entries.hasNext();) {
+			for (Map.Entry<Property, EList<Property>> entry : unionToSubsettingPropertyMap
+				.entrySet()) {
 
-				Map.Entry entry = (Map.Entry) entries.next();
-
-				if (((List) entry.getValue()).isEmpty()) {
-					Property unionProperty = (Property) entry.getKey();
+				if (entry.getValue().isEmpty()) {
+					Property unionProperty = entry.getKey();
 
 					if (OPTION__PROCESS.equals(options
 						.get(OPTION__EMPTY_UNIONS))) {
@@ -1625,32 +1566,30 @@
 			}
 		}
 
-		protected void processRedundantGeneralizations(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processRedundantGeneralizations(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator resultingEObjects = resultingToMergedEObjectMap
-				.keySet().iterator(); resultingEObjects.hasNext();) {
-
-				EObject resultingEObject = (EObject) resultingEObjects.next();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Classifier) {
 					Classifier classifier = (Classifier) resultingEObject;
-					EList generalizations = classifier.getGeneralizations();
+					EList<Generalization> generalizations = classifier
+						.getGeneralizations();
 
-					for (Iterator i = new ArrayList(generalizations).iterator(); i
-						.hasNext();) {
-
-						Classifier general = ((Generalization) i.next())
-							.getGeneral();
+					for (Generalization generalization : new ArrayList<Generalization>(
+						generalizations)) {
+						Classifier general = generalization.getGeneral();
 
 						if (general != null) {
-							EList generalAllParents = general.allParents();
+							EList<Classifier> generalAllParents = general
+								.allParents();
 
-							for (Iterator j = generalizations.iterator(); j
-								.hasNext();) {
+							for (Iterator<Generalization> g = generalizations
+								.iterator(); g.hasNext();) {
 
-								Generalization otherGeneralization = (Generalization) j
-									.next();
+								Generalization otherGeneralization = g.next();
 								Classifier otherGeneral = otherGeneralization
 									.getGeneral();
 
@@ -1681,7 +1620,7 @@
 														otherGeneral}));
 										}
 
-										j.remove();
+										g.remove();
 									} else if (OPTION__REPORT
 										.equals(options
 											.get(OPTION__REDUNDANT_GENERALIZATIONS))
@@ -1713,43 +1652,36 @@
 			}
 		}
 
-		protected void processAssociationSpecializations(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processAssociationSpecializations(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator entries = resultingToMergedEObjectMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				EObject resultingEObject = (EObject) entry.getKey();
+			for (EObject resultingEObject : resultingToMergedEObjectMap
+				.keySet()) {
 
 				if (resultingEObject instanceof Association) {
 					Association association = (Association) resultingEObject;
 
-					List generalAssociations = new UniqueEList.FastCompare();
+					EList<Association> generalAssociations = new UniqueEList.FastCompare<Association>();
 
-					for (Iterator memberEnds = association.getMemberEnds()
-						.iterator(); memberEnds.hasNext();) {
+					for (Property memberEnd : association.getMemberEnds()) {
 
-						Property memberEnd = (Property) memberEnds.next();
+						for (Property redefinedProperty : memberEnd
+							.getRedefinedProperties()) {
 
-						for (Iterator redefinedProperties = memberEnd
-							.getRedefinedProperties().iterator(); redefinedProperties
-							.hasNext();) {
-
-							Association redefinedAssociation = ((Property) redefinedProperties
-								.next()).getAssociation();
+							Association redefinedAssociation = redefinedProperty
+								.getAssociation();
 
 							if (redefinedAssociation != null) {
 								generalAssociations.add(redefinedAssociation);
 							}
 						}
 
-						for (Iterator subsettedProperties = memberEnd
-							.getSubsettedProperties().iterator(); subsettedProperties
-							.hasNext();) {
+						for (Property subsettedProperty : memberEnd
+							.getSubsettedProperties()) {
 
-							Association subsettedAssociation = ((Property) subsettedProperties
-								.next()).getAssociation();
+							Association subsettedAssociation = subsettedProperty
+								.getAssociation();
 
 							if (subsettedAssociation != null) {
 								generalAssociations.add(subsettedAssociation);
@@ -1757,13 +1689,10 @@
 						}
 					}
 
-					for (Iterator i = generalAssociations.iterator(); i
-						.hasNext();) {
-
-						Association generalAssocation = (Association) i.next();
+					for (Association generalAssociation : generalAssociations) {
 
 						if (!association.allParents().contains(
-							generalAssocation)) {
+							generalAssociation)) {
 
 							if (OPTION__PROCESS.equals(options
 								.get(OPTION__ASSOCIATION_SPECIALIZATIONS))) {
@@ -1779,13 +1708,13 @@
 													"_UI_PackageMerger_ProcessAssociationSpecialization_diagnostic", //$NON-NLS-1$
 													getMessageSubstitutions(
 														context, association,
-														generalAssocation)),
+														generalAssociation)),
 											new Object[]{association,
-												generalAssocation}));
+												generalAssociation}));
 								}
 
 								association
-									.createGeneralization(generalAssocation);
+									.createGeneralization(generalAssociation);
 							} else if (OPTION__REPORT.equals(options
 								.get(OPTION__ASSOCIATION_SPECIALIZATIONS))
 								&& diagnostics != null) {
@@ -1800,9 +1729,9 @@
 												"_UI_PackageMerger_ReportAssociationSpecialization_diagnostic", //$NON-NLS-1$
 												getMessageSubstitutions(
 													context, association,
-													generalAssocation)),
+													generalAssociation)),
 										new Object[]{association,
-											generalAssocation}));
+											generalAssociation}));
 							}
 						}
 					}
@@ -1810,24 +1739,20 @@
 			}
 		}
 
-		protected void processCapabilities(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processCapabilities(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator entries = resultingToMergedEObjectMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				EObject resultingEObject = (EObject) entry.getKey();
+			for (Map.Entry<EObject, List<EObject>> entry : resultingToMergedEObjectMap
+				.entrySet()) {
+				EObject resultingEObject = entry.getKey();
 
 				if (resultingEObject instanceof RedefinableElement) {
 					org.eclipse.uml2.uml.Package resultingPackage = ((RedefinableElement) resultingEObject)
 						.getNearestPackage();
 
-					for (Iterator mergedEObjects = ((List) entry.getValue())
-						.iterator(); mergedEObjects.hasNext();) {
-
-						org.eclipse.uml2.uml.Package mergedPackage = ((Element) mergedEObjects
-							.next()).getNearestPackage();
+					for (EObject mergedEObject : entry.getValue()) {
+						org.eclipse.uml2.uml.Package mergedPackage = ((Element) mergedEObject)
+							.getNearestPackage();
 
 						if (OPTION__PROCESS.equals(options
 							.get(OPTION__CAPABILITIES))) {
@@ -1875,8 +1800,8 @@
 			}
 		}
 
-		protected void processOptions(Map options, DiagnosticChain diagnostics,
-				Map context) {
+		protected void processOptions(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 			if (!OPTION__IGNORE.equals(options
 				.get(OPTION__DIFFERENT_PROPERTY_STATICITY))) {
@@ -1943,8 +1868,9 @@
 		 * @param context
 		 *            The cache of context-specific information.
 		 */
-		public void merge(org.eclipse.uml2.uml.Package package_, Map options,
-				DiagnosticChain diagnostics, Map context) {
+		public void merge(org.eclipse.uml2.uml.Package package_,
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 			receivingPackage = package_;
 
 			mergedPackages = getAllMergedPackages(package_);
@@ -1965,7 +1891,7 @@
 	 * elements.
 	 */
 	public static class UML2EcoreConverter
-			extends UMLSwitch
+			extends UMLSwitch<Object>
 			implements Converter {
 
 		protected class NameMatcher
@@ -1983,6 +1909,7 @@
 				super(eTypedElement);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 				return super.matches(otherEObject)
 					&& safeEquals(((ETypedElement) eObject).getEType(),
@@ -1997,21 +1924,22 @@
 				super(eOperation);
 			}
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 
 				if (super.matches(otherEObject)) {
-					List eParameters = ((EOperation) eObject).getEParameters();
+					List<EParameter> eParameters = ((EOperation) eObject)
+						.getEParameters();
 					int eParametersSize = eParameters.size();
-					List otherEParameters = ((EOperation) otherEObject)
+					List<EParameter> otherEParameters = ((EOperation) otherEObject)
 						.getEParameters();
 
 					if (eParametersSize == otherEParameters.size()) {
 
 						for (int i = 0; i < eParametersSize; i++) {
 
-							if (!new ETypeMatcher((ETypedElement) eParameters
-								.get(i)).matches((EObject) otherEParameters
-								.get(i))) {
+							if (!new ETypeMatcher(eParameters.get(i))
+								.matches(otherEParameters.get(i))) {
 
 								return false;
 							}
@@ -2186,9 +2114,9 @@
 		 */
 		public static final int ANNOTATION_DETAILS = DIAGNOSTIC_CODE_OFFSET + 12;
 
-		protected final Map elementToEModelElementMap = new LinkedHashMap();
+		protected final Map<Element, EModelElement> elementToEModelElementMap = new LinkedHashMap<Element, EModelElement>();
 
-		protected Collection packages = null;
+		protected Collection<org.eclipse.uml2.uml.Package> packages = null;
 
 		protected void setName(ENamedElement eNamedElement, String name,
 				boolean validate) {
@@ -2211,29 +2139,29 @@
 				if (!isEmpty(qualifiedName) && type instanceof PrimitiveType) {
 
 					if ("UMLPrimitiveTypes::Boolean".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEBoolean();
+						eType = EcorePackage.Literals.EBOOLEAN;
 					} else if ("UMLPrimitiveTypes::Integer".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEInt();
+						eType = EcorePackage.Literals.EINT;
 					} else if ("UMLPrimitiveTypes::String".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEString();
+						eType = EcorePackage.Literals.ESTRING;
 					} else if ("UMLPrimitiveTypes::UnlimitedNatural".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEInt();
+						eType = EcorePackage.Literals.EINT;
 					} else if ("JavaPrimitiveTypes::boolean".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEBoolean();
+						eType = EcorePackage.Literals.EBOOLEAN;
 					} else if ("JavaPrimitiveTypes::byte".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEByte();
+						eType = EcorePackage.Literals.EBYTE;
 					} else if ("JavaPrimitiveTypes::char".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEChar();
+						eType = EcorePackage.Literals.ECHAR;
 					} else if ("JavaPrimitiveTypes::double".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEDouble();
+						eType = EcorePackage.Literals.EDOUBLE;
 					} else if ("JavaPrimitiveTypes::float".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEFloat();
+						eType = EcorePackage.Literals.EFLOAT;
 					} else if ("JavaPrimitiveTypes::int".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEInt();
+						eType = EcorePackage.Literals.EINT;
 					} else if ("JavaPrimitiveTypes::long".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getELong();
+						eType = EcorePackage.Literals.ELONG;
 					} else if ("JavaPrimitiveTypes::short".equals(qualifiedName)) { //$NON-NLS-1$
-						eType = EcorePackage.eINSTANCE.getEShort();
+						eType = EcorePackage.Literals.ESHORT;
 					} else if (qualifiedName
 						.startsWith("EcorePrimitiveTypes::")) { //$NON-NLS-1$
 
@@ -2267,11 +2195,7 @@
 				+ NamedElement.SEPARATOR + name);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseClass(org.eclipse.uml2.uml.Class)
-		 */
+		@Override
 		public Object caseClass(org.eclipse.uml2.uml.Class class_) {
 			org.eclipse.uml2.uml.Package package_ = class_.getNearestPackage();
 
@@ -2294,18 +2218,11 @@
 			return super.caseClass(class_);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseComment(org.eclipse.uml2.uml.Comment)
-		 */
+		@Override
 		public Object caseComment(Comment comment) {
 
-			for (Iterator annotatedElements = comment.getAnnotatedElements()
-				.iterator(); annotatedElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) doSwitch((Element) annotatedElements
-					.next());
+			for (Element annotatedElement : comment.getAnnotatedElements()) {
+				EModelElement eModelElement = (EModelElement) doSwitch(annotatedElement);
 
 				if (eModelElement != null) {
 					addDocumentation(eModelElement, comment.getBody());
@@ -2315,11 +2232,7 @@
 			return super.caseComment(comment);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseConstraint(org.eclipse.uml2.uml.Constraint)
-		 */
+		@Override
 		public Object caseConstraint(Constraint constraint) {
 			Namespace context = constraint.getContext();
 
@@ -2346,8 +2259,8 @@
 
 								setName(eOperation, name, true);
 
-								eOperation.setEType(EcorePackage.eINSTANCE
-									.getEBoolean());
+								eOperation
+									.setEType(EcorePackage.Literals.EBOOLEAN);
 
 								EParameter eParameter = EcoreFactory.eINSTANCE
 									.createEParameter();
@@ -2355,8 +2268,8 @@
 								eOperation.getEParameters().add(eParameter);
 
 								setName(eParameter, "diagnostics", false); //$NON-NLS-1$
-								eParameter.setEType(EcorePackage.eINSTANCE
-									.getEDiagnosticChain());
+								eParameter
+									.setEType(EcorePackage.Literals.EDIAGNOSTIC_CHAIN);
 
 								eParameter = EcoreFactory.eINSTANCE
 									.createEParameter();
@@ -2364,8 +2277,25 @@
 								eOperation.getEParameters().add(eParameter);
 
 								setName(eParameter, "context", false); //$NON-NLS-1$
-								eParameter.setEType(EcorePackage.eINSTANCE
-									.getEMap());
+
+								EGenericType eGenericType = EcoreFactory.eINSTANCE
+									.createEGenericType();
+								eGenericType
+									.setEClassifier(EcorePackage.Literals.EMAP);
+								EGenericType eGenericKeyType = EcoreFactory.eINSTANCE
+									.createEGenericType();
+								eGenericKeyType
+									.setEClassifier(EcorePackage.Literals.EJAVA_OBJECT);
+								eGenericType.getETypeArguments().add(
+									eGenericKeyType);
+								EGenericType eGenericValueType = EcoreFactory.eINSTANCE
+									.createEGenericType();
+								eGenericValueType
+									.setEClassifier(EcorePackage.Literals.EJAVA_OBJECT);
+								eGenericType.getETypeArguments().add(
+									eGenericValueType);
+
+								eParameter.setEGenericType(eGenericType);
 
 								defaultCase(constraint);
 
@@ -2394,20 +2324,12 @@
 			return super.caseConstraint(constraint);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseEModelElement(org.eclipse.emf.ecore.EModelElement)
-		 */
+		@Override
 		public Object caseEModelElement(EModelElement eModelElement) {
 			return eModelElement;
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseEnumeration(org.eclipse.uml2.uml.Enumeration)
-		 */
+		@Override
 		public Object caseEnumeration(Enumeration enumeration) {
 			org.eclipse.uml2.uml.Package package_ = enumeration
 				.getNearestPackage();
@@ -2429,11 +2351,7 @@
 			return super.caseEnumeration(enumeration);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseEnumerationLiteral(org.eclipse.uml2.uml.EnumerationLiteral)
-		 */
+		@Override
 		public Object caseEnumerationLiteral(
 				EnumerationLiteral enumerationLiteral) {
 			Enumeration enumeration = enumerationLiteral.getEnumeration();
@@ -2472,11 +2390,7 @@
 			return super.caseEnumerationLiteral(enumerationLiteral);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseGeneralization(org.eclipse.uml2.uml.Generalization)
-		 */
+		@Override
 		public Object caseGeneralization(Generalization generalization) {
 			Classifier specific = generalization.getSpecific();
 
@@ -2518,11 +2432,7 @@
 			return super.caseGeneralization(generalization);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseInterfaceRealization(org.eclipse.uml2.uml.InterfaceRealization)
-		 */
+		@Override
 		public Object caseInterfaceRealization(
 				InterfaceRealization interfaceRealization) {
 			BehavioredClassifier implementingClassifier = interfaceRealization
@@ -2549,11 +2459,7 @@
 			return super.caseInterfaceRealization(interfaceRealization);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseInterface(org.eclipse.uml2.uml.Interface)
-		 */
+		@Override
 		public Object caseInterface(Interface interface_) {
 			org.eclipse.uml2.uml.Package package_ = interface_
 				.getNearestPackage();
@@ -2578,11 +2484,7 @@
 			return super.caseInterface(interface_);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseMultiplicityElement(org.eclipse.uml2.uml.MultiplicityElement)
-		 */
+		@Override
 		public Object caseMultiplicityElement(
 				MultiplicityElement multiplicityElement) {
 			Object eModelElement = elementToEModelElementMap
@@ -2612,11 +2514,7 @@
 			}
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseOperation(org.eclipse.uml2.uml.Operation)
-		 */
+		@Override
 		public Object caseOperation(Operation operation) {
 			Namespace namespace = operation.getNamespace();
 
@@ -2632,13 +2530,10 @@
 
 				setName(eOperation, operation);
 
-				EList eExceptions = eOperation.getEExceptions();
+				EList<EClassifier> eExceptions = eOperation.getEExceptions();
 
-				for (Iterator raisedExceptions = operation
-					.getRaisedExceptions().iterator(); raisedExceptions
-					.hasNext();) {
-
-					EClassifier eType = getEType((Type) raisedExceptions.next());
+				for (Type raisedException : operation.getRaisedExceptions()) {
+					EClassifier eType = getEType(raisedException);
 
 					if (eType != null) {
 						eExceptions.add(eType);
@@ -2670,11 +2565,7 @@
 			return super.caseOperation(operation);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#casePackage(org.eclipse.uml2.uml.Package)
-		 */
+		@Override
 		public Object casePackage(org.eclipse.uml2.uml.Package package_) {
 			EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
 			elementToEModelElementMap.put(package_, ePackage);
@@ -2709,11 +2600,7 @@
 			return ePackage;
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseParameter(org.eclipse.uml2.uml.Parameter)
-		 */
+		@Override
 		public Object caseParameter(Parameter parameter) {
 			Operation operation = parameter.getOperation();
 
@@ -2740,11 +2627,7 @@
 			return super.caseParameter(parameter);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#casePrimitiveType(org.eclipse.uml2.uml.PrimitiveType)
-		 */
+		@Override
 		public Object casePrimitiveType(PrimitiveType primitiveType) {
 			org.eclipse.uml2.uml.Package package_ = primitiveType
 				.getNearestPackage();
@@ -2768,11 +2651,7 @@
 			return super.casePrimitiveType(primitiveType);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseDataType(org.eclipse.uml2.uml.DataType)
-		 */
+		@Override
 		public Object caseDataType(DataType dataType) {
 			org.eclipse.uml2.uml.Package package_ = dataType
 				.getNearestPackage();
@@ -2794,11 +2673,7 @@
 			return super.caseDataType(dataType);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseProperty(org.eclipse.uml2.uml.Property)
-		 */
+		@Override
 		public Object caseProperty(Property property) {
 			Namespace namespace = property.getNamespace();
 
@@ -2867,11 +2742,7 @@
 			return super.caseProperty(property);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseTypedElement(org.eclipse.uml2.uml.TypedElement)
-		 */
+		@Override
 		public Object caseTypedElement(TypedElement typedElement) {
 			Object eModelElement = elementToEModelElementMap.get(typedElement);
 
@@ -2886,27 +2757,17 @@
 			return super.caseTypedElement(typedElement);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#defaultCase(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public Object defaultCase(EObject eObject) {
 
-			for (Iterator eContents = eObject.eContents().iterator(); eContents
-				.hasNext();) {
-
-				doSwitch((EObject) eContents.next());
+			for (EObject eContent : eObject.eContents()) {
+				doSwitch(eContent);
 			}
 
 			return super.defaultCase(eObject);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#doSwitch(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public Object doSwitch(EObject eObject) {
 
 			if (!elementToEModelElementMap.containsKey(eObject)) {
@@ -2918,8 +2779,9 @@
 
 		protected void processEcoreTaggedValue(EModelElement eModelElement,
 				EStructuralFeature eStructuralFeature, Element element,
-				Stereotype stereotype, String propertyName, Map options,
-				DiagnosticChain diagnostics, Map context) {
+				Stereotype stereotype, String propertyName,
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
 			if (element.hasValue(stereotype, propertyName)) {
 				Object value = element.getValue(stereotype, propertyName);
@@ -3147,19 +3009,22 @@
 		}
 
 		protected void processEcoreTaggedValues(EClassifier eClassifier,
-				final Element element, final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
-			Stereotype eClassifierStereotype = (Stereotype) new EcoreSwitch() {
+				final Element element, final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
+			Stereotype eClassifierStereotype = new EcoreSwitch<Stereotype>() {
 
-				public Object caseEClass(EClass eClass) {
+				@Override
+				public Stereotype caseEClass(EClass eClass) {
 					Stereotype eClassStereotype = getAppliedEcoreStereotype(
 						element, STEREOTYPE__E_CLASS);
 
 					if (eClassStereotype != null) {
-						processEcoreTaggedValue(eClass, EcorePackage.eINSTANCE
-							.getENamedElement_Name(), element,
-							eClassStereotype, TAG_DEFINITION__CLASS_NAME,
-							options, diagnostics, context);
+						processEcoreTaggedValue(eClass,
+							EcorePackage.Literals.ENAMED_ELEMENT__NAME,
+							element, eClassStereotype,
+							TAG_DEFINITION__CLASS_NAME, options, diagnostics,
+							context);
 
 						processEcoreTaggedValue(eClass, null, element,
 							eClassStereotype, TAG_DEFINITION__XML_CONTENT_KIND,
@@ -3169,13 +3034,14 @@
 					return eClassStereotype;
 				}
 
-				public Object caseEDataType(EDataType eDataType) {
+				@Override
+				public Stereotype caseEDataType(EDataType eDataType) {
 					Stereotype eDataTypeStereotype = getAppliedEcoreStereotype(
 						element, STEREOTYPE__E_DATA_TYPE);
 
 					if (eDataTypeStereotype != null) {
 						processEcoreTaggedValue(eDataType,
-							EcorePackage.eINSTANCE.getENamedElement_Name(),
+							EcorePackage.Literals.ENAMED_ELEMENT__NAME,
 							element, eDataTypeStereotype,
 							TAG_DEFINITION__DATA_TYPE_NAME, options,
 							diagnostics, context);
@@ -3190,22 +3056,25 @@
 					eClassifierStereotype, TAG_DEFINITION__XML_NAME, options,
 					diagnostics, context);
 
-				processEcoreTaggedValue(eClassifier, EcorePackage.eINSTANCE
-					.getEClassifier_InstanceClassName(), element,
-					eClassifierStereotype, TAG_DEFINITION__INSTANCE_CLASS_NAME,
-					options, diagnostics, context);
+				processEcoreTaggedValue(eClassifier,
+					EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME,
+					element, eClassifierStereotype,
+					TAG_DEFINITION__INSTANCE_CLASS_NAME, options, diagnostics,
+					context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(EEnum eEnum, Element element,
-				Map options, DiagnosticChain diagnostics, Map context) {
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 			Stereotype eEnumStereotype = getAppliedEcoreStereotype(element,
 				STEREOTYPE__E_ENUM);
 
 			if (eEnumStereotype != null) {
-				processEcoreTaggedValue(eEnum, EcorePackage.eINSTANCE
-					.getENamedElement_Name(), element, eEnumStereotype,
-					TAG_DEFINITION__ENUM_NAME, options, diagnostics, context);
+				processEcoreTaggedValue(eEnum,
+					EcorePackage.Literals.ENAMED_ELEMENT__NAME, element,
+					eEnumStereotype, TAG_DEFINITION__ENUM_NAME, options,
+					diagnostics, context);
 
 				processEcoreTaggedValue(eEnum, null, element, eEnumStereotype,
 					TAG_DEFINITION__XML_NAME, options, diagnostics, context);
@@ -3213,53 +3082,55 @@
 		}
 
 		protected void processEcoreTaggedValues(EEnumLiteral eEnumLiteral,
-				Element element, Map options, DiagnosticChain diagnostics,
-				Map context) {
+				Element element, Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 			Stereotype eEnumLiteralStereotype = getAppliedEcoreStereotype(
 				element, STEREOTYPE__E_ENUM_LITERAL);
 
 			if (eEnumLiteralStereotype != null) {
-				processEcoreTaggedValue(eEnumLiteral, EcorePackage.eINSTANCE
-					.getENamedElement_Name(), element, eEnumLiteralStereotype,
-					TAG_DEFINITION__ENUM_LITERAL_NAME, options, diagnostics,
-					context);
+				processEcoreTaggedValue(eEnumLiteral,
+					EcorePackage.Literals.ENAMED_ELEMENT__NAME, element,
+					eEnumLiteralStereotype, TAG_DEFINITION__ENUM_LITERAL_NAME,
+					options, diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(EOperation eOperation,
-				Element element, Map options, DiagnosticChain diagnostics,
-				Map context) {
+				Element element, Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 			Stereotype eOperationStereotype = getAppliedEcoreStereotype(
 				element, STEREOTYPE__E_OPERATION);
 
 			if (eOperationStereotype != null) {
-				processEcoreTaggedValue(eOperation, EcorePackage.eINSTANCE
-					.getENamedElement_Name(), element, eOperationStereotype,
-					TAG_DEFINITION__OPERATION_NAME, options, diagnostics,
-					context);
+				processEcoreTaggedValue(eOperation,
+					EcorePackage.Literals.ENAMED_ELEMENT__NAME, element,
+					eOperationStereotype, TAG_DEFINITION__OPERATION_NAME,
+					options, diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(EPackage ePackage,
-				Element element, Map options, DiagnosticChain diagnostics,
-				Map context) {
+				Element element, Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 			Stereotype ePackageStereotype = getAppliedEcoreStereotype(element,
 				STEREOTYPE__E_PACKAGE);
 
 			if (ePackageStereotype != null) {
-				processEcoreTaggedValue(ePackage, EcorePackage.eINSTANCE
-					.getENamedElement_Name(), element, ePackageStereotype,
-					TAG_DEFINITION__PACKAGE_NAME, options, diagnostics, context);
+				processEcoreTaggedValue(ePackage,
+					EcorePackage.Literals.ENAMED_ELEMENT__NAME, element,
+					ePackageStereotype, TAG_DEFINITION__PACKAGE_NAME, options,
+					diagnostics, context);
 
-				processEcoreTaggedValue(ePackage, EcorePackage.eINSTANCE
-					.getEPackage_NsPrefix(), element, ePackageStereotype,
-					TAG_DEFINITION__NS_PREFIX, options, diagnostics, context);
+				processEcoreTaggedValue(ePackage,
+					EcorePackage.Literals.EPACKAGE__NS_PREFIX, element,
+					ePackageStereotype, TAG_DEFINITION__NS_PREFIX, options,
+					diagnostics, context);
 
 				if (isEmpty(ePackage.getNsPrefix())) {
-					processEcoreTaggedValue(ePackage, EcorePackage.eINSTANCE
-						.getEPackage_NsPrefix(), element, ePackageStereotype,
-						TAG_DEFINITION__BASE_PACKAGE, options, diagnostics,
-						context);
+					processEcoreTaggedValue(ePackage,
+						EcorePackage.Literals.EPACKAGE__NS_PREFIX, element,
+						ePackageStereotype, TAG_DEFINITION__BASE_PACKAGE,
+						options, diagnostics, context);
 
 					String nsPrefix = ePackage.getNsPrefix();
 
@@ -3269,45 +3140,48 @@
 					}
 				}
 
-				processEcoreTaggedValue(ePackage, EcorePackage.eINSTANCE
-					.getEPackage_NsURI(), element, ePackageStereotype,
-					TAG_DEFINITION__NS_URI, options, diagnostics, context);
+				processEcoreTaggedValue(ePackage,
+					EcorePackage.Literals.EPACKAGE__NS_URI, element,
+					ePackageStereotype, TAG_DEFINITION__NS_URI, options,
+					diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(EParameter eParameter,
-				Element element, Map options, DiagnosticChain diagnostics,
-				Map context) {
+				Element element, Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 			Stereotype eParameterStereotype = getAppliedEcoreStereotype(
 				element, STEREOTYPE__E_PARAMETER);
 
 			if (eParameterStereotype != null) {
-				processEcoreTaggedValue(eParameter, EcorePackage.eINSTANCE
-					.getENamedElement_Name(), element, eParameterStereotype,
-					TAG_DEFINITION__PARAMETER_NAME, options, diagnostics,
-					context);
+				processEcoreTaggedValue(eParameter,
+					EcorePackage.Literals.ENAMED_ELEMENT__NAME, element,
+					eParameterStereotype, TAG_DEFINITION__PARAMETER_NAME,
+					options, diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(
 				EStructuralFeature eStructuralFeature, final Element element,
-				final Map options, final DiagnosticChain diagnostics,
-				final Map context) {
-			Stereotype eStructuralFeatureStereotype = (Stereotype) new EcoreSwitch() {
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
+			Stereotype eStructuralFeatureStereotype = new EcoreSwitch<Stereotype>() {
 
-				public Object caseEAttribute(EAttribute eAttribute) {
+				@Override
+				public Stereotype caseEAttribute(EAttribute eAttribute) {
 					Stereotype eAttributeStereotype = getAppliedEcoreStereotype(
 						element, STEREOTYPE__E_ATTRIBUTE);
 
 					if (eAttributeStereotype != null) {
 						processEcoreTaggedValue(eAttribute,
-							EcorePackage.eINSTANCE.getENamedElement_Name(),
+							EcorePackage.Literals.ENAMED_ELEMENT__NAME,
 							element, eAttributeStereotype,
 							TAG_DEFINITION__ATTRIBUTE_NAME, options,
 							diagnostics, context);
 
 						processEcoreTaggedValue(eAttribute,
-							EcorePackage.eINSTANCE.getEAttribute_ID(), element,
+							EcorePackage.Literals.EATTRIBUTE__ID, element,
 							eAttributeStereotype, TAG_DEFINITION__IS_ID,
 							options, diagnostics, context);
 					}
@@ -3315,21 +3189,21 @@
 					return eAttributeStereotype;
 				}
 
-				public Object caseEReference(EReference eReference) {
+				@Override
+				public Stereotype caseEReference(EReference eReference) {
 					Stereotype eReferenceStereotype = getAppliedEcoreStereotype(
 						element, STEREOTYPE__E_REFERENCE);
 
 					if (eReferenceStereotype != null) {
 						processEcoreTaggedValue(eReference,
-							EcorePackage.eINSTANCE.getENamedElement_Name(),
+							EcorePackage.Literals.ENAMED_ELEMENT__NAME,
 							element, eReferenceStereotype,
 							TAG_DEFINITION__REFERENCE_NAME, options,
 							diagnostics, context);
 
 						processEcoreTaggedValue(eReference,
-							EcorePackage.eINSTANCE
-								.getEReference_ResolveProxies(), element,
-							eReferenceStereotype,
+							EcorePackage.Literals.EREFERENCE__RESOLVE_PROXIES,
+							element, eReferenceStereotype,
 							TAG_DEFINITION__IS_RESOLVE_PROXIES, options,
 							diagnostics, context);
 					}
@@ -3340,18 +3214,18 @@
 
 			if (eStructuralFeatureStereotype != null) {
 				processEcoreTaggedValue(eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Transient(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__TRANSIENT,
 					element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_TRANSIENT, options, diagnostics, context);
 
 				processEcoreTaggedValue(eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Unsettable(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__UNSETTABLE,
 					element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_UNSETTABLE, options, diagnostics,
 					context);
 
 				processEcoreTaggedValue(eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Volatile(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__TRANSIENT,
 					element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_VOLATILE, options, diagnostics, context);
 
@@ -3375,66 +3249,71 @@
 			}
 		}
 
-		protected void processEcoreTaggedValues(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processEcoreTaggedValues(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
+			for (final Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				EModelElement eModelElement = entry.getValue();
 
-				final Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+				new EcoreSwitch<Object>() {
 
-				new EcoreSwitch() {
-
+					@Override
 					public Object caseEClassifier(EClassifier eClassifier) {
-						processEcoreTaggedValues(eClassifier, (Element) entry
-							.getKey(), options, diagnostics, context);
+						processEcoreTaggedValues(eClassifier, entry.getKey(),
+							options, diagnostics, context);
 
 						return eClassifier;
 					}
 
+					@Override
 					public Object caseEEnum(EEnum eEnum) {
-						processEcoreTaggedValues(eEnum, (Element) entry
-							.getKey(), options, diagnostics, context);
+						processEcoreTaggedValues(eEnum, entry.getKey(),
+							options, diagnostics, context);
 
 						return eEnum;
 					}
 
+					@Override
 					public Object caseEEnumLiteral(EEnumLiteral eEnumLiteral) {
-						processEcoreTaggedValues(eEnumLiteral, (Element) entry
-							.getKey(), options, diagnostics, context);
+						processEcoreTaggedValues(eEnumLiteral, entry.getKey(),
+							options, diagnostics, context);
 
 						return eEnumLiteral;
 					}
 
+					@Override
 					public Object caseEOperation(EOperation eOperation) {
-						processEcoreTaggedValues(eOperation, (Element) entry
-							.getKey(), options, diagnostics, context);
+						processEcoreTaggedValues(eOperation, entry.getKey(),
+							options, diagnostics, context);
 
 						return eOperation;
 					}
 
+					@Override
 					public Object caseEPackage(EPackage ePackage) {
 						processEcoreTaggedValues(
 
-						ePackage, (Element) entry.getKey(), options,
-							diagnostics, context);
+						ePackage, entry.getKey(), options, diagnostics, context);
 
 						return ePackage;
 					}
 
+					@Override
 					public Object caseEParameter(EParameter eParameter) {
-						processEcoreTaggedValues(eParameter, (Element) entry
-							.getKey(), options, diagnostics, context);
+						processEcoreTaggedValues(eParameter, entry.getKey(),
+							options, diagnostics, context);
 
 						return eParameter;
 					}
 
+					@Override
 					public Object caseEStructuralFeature(
 							EStructuralFeature eStructuralFeature) {
-						processEcoreTaggedValues(eStructuralFeature,
-							(Element) entry.getKey(), options, diagnostics,
-							context);
+						processEcoreTaggedValues(eStructuralFeature, entry
+							.getKey(), options, diagnostics, context);
 
 						return eStructuralFeature;
 					}
@@ -3443,27 +3322,21 @@
 			}
 		}
 
-		protected void processRedefiningOperations(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processRedefiningOperations(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Element element = (Element) entry.getKey();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+			for (Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				Element element = entry.getKey();
+				EModelElement eModelElement = entry.getValue();
 
 				if (eModelElement instanceof EOperation
 					&& element instanceof Operation) {
 
 					Operation operation = (Operation) element;
 
-					for (Iterator redefinedOperations = operation
-						.getRedefinedOperations().iterator(); redefinedOperations
-						.hasNext();) {
-
-						Operation redefinedOperation = (Operation) redefinedOperations
-							.next();
+					for (Operation redefinedOperation : operation
+						.getRedefinedOperations()) {
 
 						EOperation eOperation = (EOperation) elementToEModelElementMap
 							.get(redefinedOperation);
@@ -3515,27 +3388,22 @@
 			}
 		}
 
-		protected void processRedefiningProperties(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processRedefiningProperties(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
+			for (Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
 
-				Map.Entry entry = (Map.Entry) entries.next();
-				Element element = (Element) entry.getKey();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+				Element element = entry.getKey();
+				EModelElement eModelElement = entry.getValue();
 
 				if (eModelElement instanceof EStructuralFeature
 					&& element instanceof Property) {
 
 					Property property = (Property) element;
 
-					for (Iterator redefinedProperties = property
-						.getRedefinedProperties().iterator(); redefinedProperties
-						.hasNext();) {
-
-						Property redefinedProperty = (Property) redefinedProperties
-							.next();
+					for (Property redefinedProperty : property
+						.getRedefinedProperties()) {
 
 						if (redefinedProperty.getOwningAssociation() == null) {
 							EStructuralFeature eStructuralFeature = (EStructuralFeature) elementToEModelElementMap
@@ -3596,12 +3464,7 @@
 
 		protected boolean isCompositeSubset(Property property) {
 
-			for (Iterator subsettedProperties = property
-				.getSubsettedProperties().iterator(); subsettedProperties
-				.hasNext();) {
-
-				Property subsettedProperty = (Property) subsettedProperties
-					.next();
+			for (Property subsettedProperty : property.getSubsettedProperties()) {
 
 				if (subsettedProperty.isComposite()
 					|| isCompositeSubset(subsettedProperty)) {
@@ -3613,27 +3476,21 @@
 			return false;
 		}
 
-		protected void processSubsettingProperties(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processSubsettingProperties(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Element element = (Element) entry.getKey();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+			for (Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				Element element = entry.getKey();
+				EModelElement eModelElement = entry.getValue();
 
 				if (eModelElement instanceof EStructuralFeature
 					&& element instanceof Property) {
 
 					Property property = (Property) element;
 
-					for (Iterator subsettedProperties = property
-						.getSubsettedProperties().iterator(); subsettedProperties
-						.hasNext();) {
-
-						Property subsettedProperty = (Property) subsettedProperties
-							.next();
+					for (Property subsettedProperty : property
+						.getSubsettedProperties()) {
 
 						if (subsettedProperty.getOwningAssociation() == null) {
 							EStructuralFeature subsettedEStructuralFeature = (EStructuralFeature) elementToEModelElementMap
@@ -3687,7 +3544,7 @@
 								getEAnnotation(eModelElement,
 									ANNOTATION__SUBSETS, true).getReferences()
 									.add(
-										(EObject) elementToEModelElementMap
+										elementToEModelElementMap
 											.get(subsettedProperty));
 							} else if (OPTION__REPORT.equals(options
 								.get(OPTION__SUBSETTING_PROPERTIES))
@@ -3713,15 +3570,13 @@
 			}
 		}
 
-		protected void processUnionProperties(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processUnionProperties(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Element element = (Element) entry.getKey();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+			for (Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				Element element = entry.getKey();
+				EModelElement eModelElement = entry.getValue();
 
 				if (eModelElement instanceof EStructuralFeature
 					&& element instanceof Property
@@ -3776,14 +3631,11 @@
 			}
 		}
 
-		protected void processDerivedFeatures(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processDerivedFeatures(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
-			for (Iterator eModelElements = elementToEModelElementMap.values()
-				.iterator(); eModelElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) eModelElements
-					.next();
+			for (EModelElement eModelElement : elementToEModelElementMap
+				.values()) {
 
 				if (eModelElement instanceof EStructuralFeature) {
 					EStructuralFeature.Internal eStructuralFeature = (EStructuralFeature.Internal) eModelElement;
@@ -3961,35 +3813,27 @@
 			}
 		}
 
-		protected void processDuplicateOperations(Map options,
-				DiagnosticChain diagnostics, Map context) {
-			List operationsToDuplicate = new UniqueEList.FastCompare();
+		protected void processDuplicateOperations(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
+			List<EOperation> operationsToDuplicate = new UniqueEList.FastCompare<EOperation>();
 
-			for (Iterator eModelElements = elementToEModelElementMap.values()
-				.iterator(); eModelElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) eModelElements
-					.next();
+			for (EModelElement eModelElement : elementToEModelElementMap
+				.values()) {
 
 				if (eModelElement instanceof EClass) {
 					EClass eClass = (EClass) eModelElement;
 
-					for (Iterator eOperations = eClass.getEOperations()
-						.iterator(); eOperations.hasNext();) {
+					for (Iterator<EOperation> eOperations = eClass
+						.getEOperations().iterator(); eOperations.hasNext();) {
+						EOperation eOperation = eOperations.next();
 
-						EOperation eOperation = (EOperation) eOperations.next();
+						for (EOperation otherEOperation : eClass
+							.getEAllOperations()) {
 
-						for (Iterator eAllOperations = eClass
-							.getEAllOperations().iterator(); eAllOperations
-							.hasNext();) {
-
-							EOperation eAllOperation = (EOperation) eAllOperations
-								.next();
-
-							if (eAllOperation == eOperation) {
+							if (otherEOperation == eOperation) {
 								break;
 							} else if (new SignatureMatcher(eOperation)
-								.matches(eAllOperation)) {
+								.matches(otherEOperation)) {
 
 								if (OPTION__PROCESS.equals(options
 									.get(OPTION__DUPLICATE_OPERATIONS))) {
@@ -4006,23 +3850,25 @@
 														getMessageSubstitutions(
 															context,
 															eOperation,
-															eAllOperation)),
+															otherEOperation)),
 												new Object[]{eClass,
-													eAllOperation}));
+													otherEOperation}));
 									}
 
 									operationsToDuplicate.add(eOperation);
 
-									ensureConformity(eOperation, eAllOperation);
+									ensureConformity(eOperation,
+										otherEOperation);
 
-									List redefinedOperations = getEAnnotation(
+									List<EObject> redefinedOperations = getEAnnotation(
 										eOperation, ANNOTATION__REDEFINES, true)
 										.getReferences();
 
 									if (!redefinedOperations
-										.contains(eAllOperation)) {
+										.contains(otherEOperation)) {
 
-										redefinedOperations.add(eAllOperation);
+										redefinedOperations
+											.add(otherEOperation);
 									}
 								} else if (OPTION__DISCARD.equals(options
 									.get(OPTION__DUPLICATE_OPERATIONS))) {
@@ -4039,9 +3885,9 @@
 														getMessageSubstitutions(
 															context,
 															eOperation,
-															eAllOperation)),
+															otherEOperation)),
 												new Object[]{eClass,
-													eAllOperation}));
+													otherEOperation}));
 									}
 
 									eOperations.remove();
@@ -4060,9 +3906,9 @@
 													"_UI_UML2EcoreConverter_ReportDuplicateOperation_diagnostic", //$NON-NLS-1$
 													getMessageSubstitutions(
 														context, eOperation,
-														eAllOperation)),
+														otherEOperation)),
 											new Object[]{eOperation,
-												eAllOperation}));
+												otherEOperation}));
 								}
 							}
 						}
@@ -4070,49 +3916,35 @@
 				}
 			}
 
-			for (Iterator eOperations = operationsToDuplicate.iterator(); eOperations
-				.hasNext();) {
-
-				EOperation eOperation = (EOperation) eOperations.next();
-
+			for (EOperation eOperation : operationsToDuplicate) {
 				getEAnnotation(eOperation.getEContainingClass(),
 					ANNOTATION__DUPLICATES, true).getContents().add(eOperation);
 			}
 		}
 
-		protected void processDuplicateOperationInheritance(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processDuplicateOperationInheritance(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator eModelElements = elementToEModelElementMap.values()
-				.iterator(); eModelElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) eModelElements
-					.next();
+			for (EModelElement eModelElement : elementToEModelElementMap
+				.values()) {
 
 				if (eModelElement instanceof EClass) {
 					EClass eClass = (EClass) eModelElement;
 
 					if (eClass.getESuperTypes().size() > 1) {
-						Iterator eSuperTypes = eClass.getESuperTypes()
+						Iterator<EClass> eSuperTypes = eClass.getESuperTypes()
 							.iterator();
 						eSuperTypes.next();
 
 						while (eSuperTypes.hasNext()) {
-							EClass mixinEClass = (EClass) eSuperTypes.next();
+							EClass mixinEClass = eSuperTypes.next();
 
-							mixinEOperationsLoop : for (Iterator mixinEOperations = mixinEClass
-								.getEAllOperations().iterator(); mixinEOperations
-								.hasNext();) {
+							mixinEOperationLoop : for (EOperation mixinEOperation : mixinEClass
+								.getEAllOperations()) {
 
-								EOperation mixinEOperation = (EOperation) mixinEOperations
-									.next();
-
-								for (Iterator eOperations = eClass
-									.getEAllOperations().iterator(); eOperations
-									.hasNext();) {
-
-									EOperation eOperation = (EOperation) eOperations
-										.next();
+								for (EOperation eOperation : eClass
+									.getEAllOperations()) {
 
 									if (eOperation == mixinEOperation) {
 										break;
@@ -4144,7 +3976,7 @@
 
 											qualifyName(mixinEOperation);
 
-											List redefinedOperations = getEAnnotation(
+											List<EObject> redefinedOperations = getEAnnotation(
 												mixinEOperation,
 												ANNOTATION__REDEFINES, true)
 												.getReferences();
@@ -4179,7 +4011,7 @@
 											}
 
 											eSuperTypes.remove();
-											break mixinEOperationsLoop;
+											break mixinEOperationLoop;
 										} else if (OPTION__REPORT
 											.equals(options
 												.get(OPTION__DUPLICATE_OPERATION_INHERITANCE))
@@ -4211,38 +4043,31 @@
 			}
 		}
 
-		protected void processDuplicateFeatures(Map options,
-				DiagnosticChain diagnostics, Map context) {
-			List featuresToDuplicate = new UniqueEList.FastCompare();
-			List featuresToRemove = new UniqueEList.FastCompare();
+		protected void processDuplicateFeatures(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
+			EList<EStructuralFeature.Internal> featuresToDuplicate = new UniqueEList.FastCompare<EStructuralFeature.Internal>();
+			EList<EStructuralFeature> featuresToRemove = new UniqueEList.FastCompare<EStructuralFeature>();
 
-			for (Iterator eModelElements = elementToEModelElementMap.values()
-				.iterator(); eModelElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) eModelElements
-					.next();
+			for (EModelElement eModelElement : elementToEModelElementMap
+				.values()) {
 
 				if (eModelElement instanceof EClass) {
 					EClass eClass = (EClass) eModelElement;
 
-					for (Iterator eStructuralFeatures = eClass
+					for (Iterator<EStructuralFeature> eStructuralFeatures = eClass
 						.getEStructuralFeatures().iterator(); eStructuralFeatures
 						.hasNext();) {
 
 						EStructuralFeature.Internal eStructuralFeature = (EStructuralFeature.Internal) eStructuralFeatures
 							.next();
 
-						for (Iterator eAllStructuralFeatures = eClass
-							.getEAllStructuralFeatures().iterator(); eAllStructuralFeatures
-							.hasNext();) {
+						for (EStructuralFeature otherEStructuralFeature : eClass
+							.getEAllStructuralFeatures()) {
 
-							EStructuralFeature eAllStructuralFeature = (EStructuralFeature) eAllStructuralFeatures
-								.next();
-
-							if (eAllStructuralFeature == eStructuralFeature) {
+							if (otherEStructuralFeature == eStructuralFeature) {
 								break;
 							} else if (new NameMatcher(eStructuralFeature)
-								.matches(eAllStructuralFeature)) {
+								.matches(otherEStructuralFeature)) {
 
 								if (OPTION__PROCESS.equals(options
 									.get(OPTION__DUPLICATE_FEATURES))) {
@@ -4259,48 +4084,48 @@
 														getMessageSubstitutions(
 															context,
 															eStructuralFeature,
-															eAllStructuralFeature)),
+															otherEStructuralFeature)),
 												new Object[]{
 													eStructuralFeature,
-													eAllStructuralFeature}));
+													otherEStructuralFeature}));
 									}
 
 									if (!featuresToDuplicate
 										.contains(eStructuralFeature)) {
 
-										EStructuralFeature duplicateEStructuralFeature = eAllStructuralFeature
+										EStructuralFeature.Internal duplicateEStructuralFeature = otherEStructuralFeature
 											.isDerived()
 											&& !eStructuralFeature.isDerived()
-											? eAllStructuralFeature
+											? (EStructuralFeature.Internal) otherEStructuralFeature
 											: eStructuralFeature;
 
 										if (DEBUG
-											&& duplicateEStructuralFeature == eAllStructuralFeature) {
+											&& duplicateEStructuralFeature == otherEStructuralFeature) {
 
 											System.err
 												.println("Non-derived feature " //$NON-NLS-1$
 													+ getQualifiedText(eStructuralFeature)
 													+ " is a duplicate of derived feature " //$NON-NLS-1$
-													+ getQualifiedText(eAllStructuralFeature));
+													+ getQualifiedText(otherEStructuralFeature));
 										}
 
 										featuresToDuplicate
 											.add(duplicateEStructuralFeature);
 
 										ensureConformity(eStructuralFeature,
-											eAllStructuralFeature);
+											otherEStructuralFeature);
 									}
 
-									EList redefinedFeatures = getEAnnotation(
+									EList<EObject> redefinedFeatures = getEAnnotation(
 										eStructuralFeature,
 										ANNOTATION__REDEFINES, true)
 										.getReferences();
 
 									if (!redefinedFeatures
-										.contains(eAllStructuralFeature)) {
+										.contains(otherEStructuralFeature)) {
 
 										redefinedFeatures
-											.add(eAllStructuralFeature);
+											.add(otherEStructuralFeature);
 									}
 								} else if (OPTION__DISCARD.equals(options
 									.get(OPTION__DUPLICATE_FEATURES))) {
@@ -4317,9 +4142,9 @@
 														getMessageSubstitutions(
 															context,
 															eStructuralFeature,
-															eAllStructuralFeature)),
+															otherEStructuralFeature)),
 												new Object[]{eClass,
-													eAllStructuralFeature}));
+													otherEStructuralFeature}));
 									}
 
 									EReference eOpposite = eStructuralFeature
@@ -4346,9 +4171,9 @@
 													getMessageSubstitutions(
 														context,
 														eStructuralFeature,
-														eAllStructuralFeature)),
+														otherEStructuralFeature)),
 											new Object[]{eStructuralFeature,
-												eAllStructuralFeature}));
+												otherEStructuralFeature}));
 								}
 							}
 						}
@@ -4356,12 +4181,7 @@
 				}
 			}
 
-			for (Iterator eStructuralFeatures = featuresToDuplicate.iterator(); eStructuralFeatures
-				.hasNext();) {
-
-				EStructuralFeature.Internal eStructuralFeature = (EStructuralFeature.Internal) eStructuralFeatures
-					.next();
-
+			for (EStructuralFeature.Internal eStructuralFeature : featuresToDuplicate) {
 				getEAnnotation(eStructuralFeature.getEContainingClass(),
 					ANNOTATION__DUPLICATES, true).getContents().add(
 					eStructuralFeature);
@@ -4382,11 +4202,7 @@
 				}
 			}
 
-			for (Iterator eStructuralFeatures = featuresToRemove.iterator(); eStructuralFeatures
-				.hasNext();) {
-
-				EStructuralFeature eStructuralFeature = (EStructuralFeature) eStructuralFeatures
-					.next();
+			for (EStructuralFeature eStructuralFeature : featuresToRemove) {
 				EClass eContainingClass = eStructuralFeature
 					.getEContainingClass();
 
@@ -4397,39 +4213,29 @@
 			}
 		}
 
-		protected void processDuplicateFeatureInheritance(Map options,
-				DiagnosticChain diagnostics, Map context) {
+		protected void processDuplicateFeatureInheritance(
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 
-			for (Iterator eModelElements = elementToEModelElementMap.values()
-				.iterator(); eModelElements.hasNext();) {
-
-				EModelElement eModelElement = (EModelElement) eModelElements
-					.next();
+			for (EModelElement eModelElement : elementToEModelElementMap
+				.values()) {
 
 				if (eModelElement instanceof EClass) {
 					EClass eClass = (EClass) eModelElement;
 
 					if (eClass.getESuperTypes().size() > 1) {
-						Iterator eSuperTypes = eClass.getESuperTypes()
+						Iterator<EClass> eSuperTypes = eClass.getESuperTypes()
 							.iterator();
 						eSuperTypes.next();
 
 						while (eSuperTypes.hasNext()) {
-							EClass mixinEClass = (EClass) eSuperTypes.next();
+							EClass mixinEClass = eSuperTypes.next();
 
-							mixinEStructuralFeaturesLoop : for (Iterator mixinEStructuralFeatures = mixinEClass
-								.getEAllStructuralFeatures().iterator(); mixinEStructuralFeatures
-								.hasNext();) {
+							mixinEStructuralFeatureLoop : for (EStructuralFeature mixinEStructuralFeature : mixinEClass
+								.getEAllStructuralFeatures()) {
 
-								EStructuralFeature mixinEStructuralFeature = (EStructuralFeature) mixinEStructuralFeatures
-									.next();
-
-								for (Iterator eStructuralFeatures = eClass
-									.getEAllStructuralFeatures().iterator(); eStructuralFeatures
-									.hasNext();) {
-
-									EStructuralFeature eStructuralFeature = (EStructuralFeature) eStructuralFeatures
-										.next();
+								for (EStructuralFeature eStructuralFeature : eClass
+									.getEAllStructuralFeatures()) {
 
 									if (eStructuralFeature == mixinEStructuralFeature) {
 										break;
@@ -4462,7 +4268,7 @@
 
 											qualifyName(mixinEStructuralFeature);
 
-											EList redefinedFeatures = getEAnnotation(
+											EList<EObject> redefinedFeatures = getEAnnotation(
 												mixinEStructuralFeature,
 												ANNOTATION__REDEFINES, true)
 												.getReferences();
@@ -4497,7 +4303,7 @@
 											}
 
 											eSuperTypes.remove();
-											break mixinEStructuralFeaturesLoop;
+											break mixinEStructuralFeatureLoop;
 										} else if (OPTION__REPORT
 											.equals(options
 												.get(OPTION__DUPLICATE_FEATURE_INHERITANCE))
@@ -4529,14 +4335,11 @@
 			}
 		}
 
-		protected void processSuperClassOrder(Map options,
-				DiagnosticChain diagnostics, Map context) {
-			Comparator eClassComparator = new Comparator() {
+		protected void processSuperClassOrder(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
+			Comparator<EClass> eClassComparator = new Comparator<EClass>() {
 
-				public int compare(Object object, Object otherObject) {
-					EClass eClass = (EClass) object;
-					EClass otherEClass = (EClass) otherObject;
-
+				public int compare(EClass eClass, EClass otherEClass) {
 					int eAllStructuralFeaturesSize = eClass
 						.getEAllStructuralFeatures().size();
 					int otherEAllStructuralFeaturesSize = otherEClass
@@ -4550,41 +4353,38 @@
 				}
 			};
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				Object key = entry.getKey();
-				Object value = entry.getValue();
+			for (Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				Element key = entry.getKey();
+				EModelElement value = entry.getValue();
 
 				if (key instanceof Classifier && value instanceof EClass) {
 					EClass eClass = (EClass) value;
-					EList eSuperTypes = eClass.getESuperTypes();
+					EList<EClass> eSuperTypes = eClass.getESuperTypes();
 
-					List extendSuperClasses = new ArrayList();
-					List unspecifiedSuperClasses = new ArrayList();
-					List mixinSuperClasses = new ArrayList();
+					List<EClass> extendSuperClasses = new ArrayList<EClass>();
+					List<EClass> unspecifiedSuperClasses = new ArrayList<EClass>();
+					List<EClass> mixinSuperClasses = new ArrayList<EClass>();
 
-					for (Iterator generalizations = ((Classifier) key)
-						.getGeneralizations().iterator(); generalizations
-						.hasNext();) {
-
-						Generalization generalization = (Generalization) generalizations
-							.next();
+					for (Generalization generalization : ((Classifier) key)
+						.getGeneralizations()) {
 						Classifier general = generalization.getGeneral();
 
 						if (general != null) {
-							EModelElement eModelElement = (EModelElement) elementToEModelElementMap
+							EModelElement eModelElement = elementToEModelElementMap
 								.get(general);
 
 							if (eSuperTypes.contains(eModelElement)) {
 
 								if (generalization.hasKeyword("extend")) { //$NON-NLS-1$
-									extendSuperClasses.add(eModelElement);
+									extendSuperClasses
+										.add((EClass) eModelElement);
 								} else if (generalization.hasKeyword("mixin")) { //$NON-NLS-1$
-									mixinSuperClasses.add(eModelElement);
+									mixinSuperClasses
+										.add((EClass) eModelElement);
 								} else {
-									unspecifiedSuperClasses.add(eModelElement);
+									unspecifiedSuperClasses
+										.add((EClass) eModelElement);
 								}
 							}
 						}
@@ -4595,7 +4395,7 @@
 					Collections.sort(unspecifiedSuperClasses, eClassComparator);
 					Collections.sort(mixinSuperClasses, eClassComparator);
 
-					List superClasses = new UniqueEList.FastCompare(
+					List<EClass> superClasses = new UniqueEList.FastCompare<EClass>(
 						extendSuperClasses);
 					superClasses.addAll(unspecifiedSuperClasses);
 					superClasses.addAll(mixinSuperClasses);
@@ -4619,10 +4419,10 @@
 										new Object[]{eClass}));
 							}
 
-							for (ListIterator sc = superClasses.listIterator(); sc
-								.hasNext();) {
+							for (ListIterator<EClass> sc = superClasses
+								.listIterator(); sc.hasNext();) {
 
-								Object superClass = sc.next();
+								EClass superClass = sc.next();
 								eSuperTypes
 									.move(sc.previousIndex(), superClass);
 							}
@@ -4647,24 +4447,20 @@
 			}
 		}
 
-		protected void processAnnotationDetails(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processAnnotationDetails(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = elementToEModelElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				final Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getValue();
+			for (final Map.Entry<Element, EModelElement> entry : elementToEModelElementMap
+				.entrySet()) {
+				EModelElement eModelElement = entry.getValue();
 
 				if (eModelElement != null) {
-					Element element = (Element) entry.getKey();
+					Element element = entry.getKey();
 
-					for (Iterator eAnnotations = element.getEAnnotations()
-						.iterator(); eAnnotations.hasNext();) {
-
-						EAnnotation eAnnotation = (EAnnotation) eAnnotations
-							.next();
-						EMap details = eAnnotation.getDetails();
+					for (EAnnotation eAnnotation : element.getEAnnotations()) {
+						EMap<String, String> details = eAnnotation.getDetails();
 
 						if (!details.isEmpty()) {
 
@@ -4712,8 +4508,8 @@
 			}
 		}
 
-		protected void processOptions(Map options, DiagnosticChain diagnostics,
-				Map context) {
+		protected void processOptions(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 			if (!OPTION__IGNORE
 				.equals(options.get(OPTION__ECORE_TAGGED_VALUES))) {
@@ -4780,27 +4576,22 @@
 			}
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.common.util.UML2Util.Converter#convert(java.util.Collection,
-		 *      java.util.Map, org.eclipse.emf.common.util.DiagnosticChain,
-		 *      java.util.Map)
-		 */
-		public Collection convert(Collection eObjects, Map options,
-				DiagnosticChain diagnostics, Map context) {
+		public Collection<? extends EObject> convert(
+				Collection<? extends EObject> eObjects,
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 			packages = EcoreUtil.getObjectsByType(eObjects,
 				UMLPackage.Literals.PACKAGE);
 
-			for (Iterator p = packages.iterator(); p.hasNext();) {
-				doSwitch((org.eclipse.uml2.uml.Package) p.next());
+			for (org.eclipse.uml2.uml.Package package_ : packages) {
+				doSwitch(package_);
 			}
 
 			if (options != null) {
 				processOptions(options, diagnostics, context);
 			}
 
-			return getRootContainers(EcoreUtil.getObjectsByType(
+			return getRootContainers(EcoreUtil.<EObject> getObjectsByType(
 				elementToEModelElementMap.values(),
 				EcorePackage.Literals.EPACKAGE));
 		}
@@ -4813,27 +4604,20 @@
 	public static class Profile2EPackageConverter
 			extends UML2EcoreConverter {
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLUtil.UML2EcoreConverter#casePackage(org.eclipse.uml2.uml.Package)
-		 */
+		@Override
 		public Object casePackage(org.eclipse.uml2.uml.Package package_) {
 
 			if (packages.contains(package_)) {
 				return super.casePackage(package_);
 			} else {
-				Object ePackage = doSwitch((Profile) packages.iterator().next());
+				EPackage ePackage = (EPackage) doSwitch(packages.iterator()
+					.next());
 				elementToEModelElementMap.put(package_, ePackage);
 				return ePackage;
 			}
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLSwitch#caseProfile(org.eclipse.uml2.uml.Profile)
-		 */
+		@Override
 		public Object caseProfile(Profile profile) {
 			EPackage ePackage = (EPackage) casePackage(profile);
 
@@ -4886,6 +4670,7 @@
 			return ePackage;
 		}
 
+		@Override
 		protected EClassifier getEType(Type type) {
 
 			if (type instanceof org.eclipse.uml2.uml.Class) {
@@ -4903,11 +4688,13 @@
 			return super.getEType(type);
 		}
 
+		@Override
 		protected void setName(final ENamedElement eNamedElement,
 				NamedElement namedElement) {
 
-			new UMLSwitch() {
+			new UMLSwitch<Object>() {
 
+				@Override
 				public Object caseClassifier(Classifier classifier) {
 					setName(eNamedElement, packages.contains(classifier
 						.getPackage())
@@ -4916,12 +4703,14 @@
 					return classifier;
 				}
 
+				@Override
 				public Object caseEnumerationLiteral(
 						EnumerationLiteral enumerationLiteral) {
 					setName(eNamedElement, enumerationLiteral.getName(), false);
 					return enumerationLiteral;
 				}
 
+				@Override
 				public Object caseNamedElement(NamedElement namedElement) {
 					setName(eNamedElement, namedElement.getName(), true);
 					return namedElement;
@@ -4930,17 +4719,14 @@
 			}.doSwitch(namedElement);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.uml.util.UMLUtil.UML2EcoreConverter#doSwitch(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public Object doSwitch(EObject eObject) {
-			Object eModelElement = super.doSwitch(eObject);
+			EObject eModelElement = (EObject) super.doSwitch(eObject);
 
 			if (eModelElement instanceof EClassifier) {
-				EList references = getEAnnotation((EClassifier) eModelElement,
-					UMLPackage.eNS_URI, true).getReferences();
+				EList<EObject> references = getEAnnotation(
+					(EClassifier) eModelElement, UMLPackage.eNS_URI, true)
+					.getReferences();
 
 				if (references.isEmpty()) {
 					references.add(eObject);
@@ -4956,7 +4742,7 @@
 	 * elements.
 	 */
 	public static class Ecore2UMLConverter
-			extends EcoreSwitch
+			extends EcoreSwitch<Object>
 			implements Converter {
 
 		/**
@@ -5028,9 +4814,9 @@
 		 */
 		public static final int ANNOTATION_DETAILS = DIAGNOSTIC_CODE_OFFSET + 5;
 
-		protected final Map eModelElementToElementMap = new LinkedHashMap();
+		protected final Map<EModelElement, Element> eModelElementToElementMap = new LinkedHashMap<EModelElement, Element>();
 
-		protected Collection ePackages = null;
+		protected Collection<EPackage> ePackages = null;
 
 		protected Model getEcorePrimitiveTypesLibrary(
 				EModelElement eModelElement) {
@@ -5040,7 +4826,7 @@
 				ResourceSet resourceSet = eResource.getResourceSet();
 
 				if (resourceSet != null) {
-					return (Model) load(
+					return load(
 						resourceSet,
 						URI
 							.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI),
@@ -5058,7 +4844,7 @@
 				ResourceSet resourceSet = eResource.getResourceSet();
 
 				if (resourceSet != null) {
-					return (Model) load(
+					return load(
 						resourceSet,
 						URI
 							.createURI(UMLResource.XML_PRIMITIVE_TYPES_LIBRARY_URI),
@@ -5119,11 +4905,7 @@
 			return getType(eTypedElement, eTypedElement.getEType());
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEAttribute(org.eclipse.emf.ecore.EAttribute)
-		 */
+		@Override
 		public Object caseEAttribute(EAttribute eAttribute) {
 			EClass eContainingClass = eAttribute.getEContainingClass();
 
@@ -5149,11 +4931,7 @@
 			return super.caseEAttribute(eAttribute);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEClass(org.eclipse.emf.ecore.EClass)
-		 */
+		@Override
 		public Object caseEClass(EClass eClass) {
 			EPackage ePackage = eClass.getEPackage();
 
@@ -5174,10 +4952,7 @@
 					classifier.setIsAbstract(eClass.isAbstract());
 				}
 
-				for (Iterator eSuperTypes = eClass.getESuperTypes().iterator(); eSuperTypes
-					.hasNext();) {
-
-					EClass eSuperType = (EClass) eSuperTypes.next();
+				for (EClass eSuperType : eClass.getESuperTypes()) {
 
 					if (eSuperType.isInterface()) {
 						((BehavioredClassifier) classifier)
@@ -5202,11 +4977,7 @@
 			return super.caseEClass(eClass);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEDataType(org.eclipse.emf.ecore.EDataType)
-		 */
+		@Override
 		public Object caseEDataType(EDataType eDataType) {
 			EPackage ePackage = eDataType.getEPackage();
 
@@ -5239,11 +5010,7 @@
 			return super.caseEDataType(eDataType);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEEnum(org.eclipse.emf.ecore.EEnum)
-		 */
+		@Override
 		public Object caseEEnum(EEnum eEnum) {
 			EPackage ePackage = eEnum.getEPackage();
 
@@ -5265,11 +5032,7 @@
 			return super.caseEEnum(eEnum);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral)
-		 */
+		@Override
 		public Object caseEEnumLiteral(EEnumLiteral eEnumLiteral) {
 			EEnum eEnum = eEnumLiteral.getEEnum();
 
@@ -5299,20 +5062,12 @@
 			return super.caseEEnumLiteral(eEnumLiteral);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEModelElement(org.eclipse.emf.ecore.EModelElement)
-		 */
+		@Override
 		public Object caseEModelElement(EModelElement eModelElement) {
 			return eModelElement;
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEOperation(org.eclipse.emf.ecore.EOperation)
-		 */
+		@Override
 		public Object caseEOperation(EOperation eOperation) {
 			EClass eContainingClass = eOperation.getEContainingClass();
 
@@ -5332,13 +5087,10 @@
 						eType));
 				}
 
-				EList raisedExceptions = operation.getRaisedExceptions();
+				EList<Type> raisedExceptions = operation.getRaisedExceptions();
 
-				for (Iterator eExceptions = eOperation.getEExceptions()
-					.iterator(); eExceptions.hasNext();) {
-
-					Type type = getType(eOperation, (EClassifier) eExceptions
-						.next());
+				for (EClassifier eException : eOperation.getEExceptions()) {
+					Type type = getType(eOperation, eException);
 
 					if (type != null) {
 						raisedExceptions.add(type);
@@ -5372,11 +5124,7 @@
 			return super.caseEOperation(eOperation);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEPackage(org.eclipse.emf.ecore.EPackage)
-		 */
+		@Override
 		public Object caseEPackage(EPackage ePackage) {
 			org.eclipse.uml2.uml.Package package_ = ePackage.getESuperPackage() == null
 				? UMLFactory.eINSTANCE.createModel()
@@ -5399,11 +5147,7 @@
 			return package_;
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEParameter(org.eclipse.emf.ecore.EParameter)
-		 */
+		@Override
 		public Object caseEParameter(EParameter eParameter) {
 			EOperation eOperation = eParameter.getEOperation();
 
@@ -5426,11 +5170,7 @@
 			return super.caseEParameter(eParameter);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseEReference(org.eclipse.emf.ecore.EReference)
-		 */
+		@Override
 		public Object caseEReference(EReference eReference) {
 			EClass eContainingClass = eReference.getEContainingClass();
 
@@ -5498,11 +5238,7 @@
 			return super.caseEReference(eReference);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#caseETypedElement(org.eclipse.emf.ecore.ETypedElement)
-		 */
+		@Override
 		public Object caseETypedElement(ETypedElement eTypedElement) {
 			Object element = eModelElementToElementMap.get(eTypedElement);
 
@@ -5539,27 +5275,17 @@
 			return super.caseETypedElement(eTypedElement);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#defaultCase(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public Object defaultCase(EObject eObject) {
 
-			for (Iterator eContents = eObject.eContents().iterator(); eContents
-				.hasNext();) {
-
-				doSwitch((EObject) eContents.next());
+			for (EObject eContent : eObject.eContents()) {
+				doSwitch(eContent);
 			}
 
 			return super.defaultCase(eObject);
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.ecore.util.EcoreSwitch#doSwitch(org.eclipse.emf.ecore.EObject)
-		 */
+		@Override
 		public Object doSwitch(EObject eObject) {
 
 			if (!eModelElementToElementMap.containsKey(eObject)) {
@@ -5576,7 +5302,7 @@
 				ResourceSet resourceSet = eResource.getResourceSet();
 
 				if (resourceSet != null) {
-					return (Profile) load(resourceSet, URI
+					return load(resourceSet, URI
 						.createURI(UMLResource.ECORE_PROFILE_URI),
 						UMLPackage.Literals.PROFILE);
 				}
@@ -5597,8 +5323,9 @@
 		protected void processEcoreTaggedValue(Element element,
 				Stereotype stereotype, String propertyName,
 				EModelElement eModelElement,
-				EStructuralFeature eStructuralFeature, Map options,
-				DiagnosticChain diagnostics, Map context) {
+				EStructuralFeature eStructuralFeature,
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 			Object value = null;
 
 			if (eStructuralFeature != null) {
@@ -5783,8 +5510,8 @@
 		}
 
 		protected void processEcoreTaggedValues(Element element,
-				EPackage ePackage, Map options, DiagnosticChain diagnostics,
-				Map context) {
+				EPackage ePackage, Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 			Stereotype ePackageStereotype = getEcoreStereotype(ePackage,
 				STEREOTYPE__E_PACKAGE);
 
@@ -5792,21 +5519,26 @@
 				safeApplyStereotype(element, ePackageStereotype);
 
 				processEcoreTaggedValue(element, ePackageStereotype,
-					TAG_DEFINITION__NS_PREFIX, ePackage, EcorePackage.eINSTANCE
-						.getEPackage_NsPrefix(), options, diagnostics, context);
+					TAG_DEFINITION__NS_PREFIX, ePackage,
+					EcorePackage.Literals.EPACKAGE__NS_PREFIX, options,
+					diagnostics, context);
 
 				processEcoreTaggedValue(element, ePackageStereotype,
-					TAG_DEFINITION__NS_URI, ePackage, EcorePackage.eINSTANCE
-						.getEPackage_NsURI(), options, diagnostics, context);
+					TAG_DEFINITION__NS_URI, ePackage,
+					EcorePackage.Literals.EPACKAGE__NS_URI, options,
+					diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(Element element,
-				final EClassifier eClassifier, final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
-			Stereotype eClassifierStereotype = (Stereotype) new UMLSwitch() {
+				final EClassifier eClassifier,
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
+			Stereotype eClassifierStereotype = new UMLSwitch<Stereotype>() {
 
-				public Object caseClass(org.eclipse.uml2.uml.Class class_) {
+				@Override
+				public Stereotype caseClass(org.eclipse.uml2.uml.Class class_) {
 					Stereotype eClassStereotype = getEcoreStereotype(
 						eClassifier, STEREOTYPE__E_CLASS);
 
@@ -5821,7 +5553,8 @@
 					return eClassStereotype;
 				}
 
-				public Object caseDataType(DataType dataType) {
+				@Override
+				public Stereotype caseDataType(DataType dataType) {
 					Stereotype eClassStereotype = getEcoreStereotype(
 						eClassifier, STEREOTYPE__E_CLASS);
 
@@ -5836,7 +5569,8 @@
 					return eClassStereotype;
 				}
 
-				public Object caseInterface(Interface interface_) {
+				@Override
+				public Stereotype caseInterface(Interface interface_) {
 					Stereotype eClassStereotype = getEcoreStereotype(
 						eClassifier, STEREOTYPE__E_CLASS);
 
@@ -5851,7 +5585,8 @@
 					return eClassStereotype;
 				}
 
-				public Object casePrimitiveType(PrimitiveType primitiveType) {
+				@Override
+				public Stereotype casePrimitiveType(PrimitiveType primitiveType) {
 					Stereotype eDataTypeStereotype = getEcoreStereotype(
 						eClassifier, STEREOTYPE__E_DATA_TYPE);
 
@@ -5870,17 +5605,20 @@
 
 				processEcoreTaggedValue(element, eClassifierStereotype,
 					TAG_DEFINITION__INSTANCE_CLASS_NAME, eClassifier,
-					EcorePackage.eINSTANCE.getEClassifier_InstanceClassName(),
+					EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME,
 					options, diagnostics, context);
 			}
 		}
 
 		protected void processEcoreTaggedValues(final Element element,
-				EStructuralFeature eStructuralFeature, final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
-			Stereotype eStructuralFeatureStereotype = (Stereotype) new EcoreSwitch() {
+				EStructuralFeature eStructuralFeature,
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
+			Stereotype eStructuralFeatureStereotype = new EcoreSwitch<Stereotype>() {
 
-				public Object caseEAttribute(EAttribute eAttribute) {
+				@Override
+				public Stereotype caseEAttribute(EAttribute eAttribute) {
 					Stereotype eAttributeStereotype = getEcoreStereotype(
 						eAttribute, STEREOTYPE__E_ATTRIBUTE);
 
@@ -5889,14 +5627,15 @@
 
 						processEcoreTaggedValue(element, eAttributeStereotype,
 							TAG_DEFINITION__IS_ID, eAttribute,
-							EcorePackage.eINSTANCE.getEAttribute_ID(), options,
+							EcorePackage.Literals.EATTRIBUTE__ID, options,
 							diagnostics, context);
 					}
 
 					return eAttributeStereotype;
 				}
 
-				public Object caseEReference(EReference eReference) {
+				@Override
+				public Stereotype caseEReference(EReference eReference) {
 					Stereotype eReferenceStereotype = getEcoreStereotype(
 						eReference, STEREOTYPE__E_REFERENCE);
 
@@ -5905,9 +5644,8 @@
 
 						processEcoreTaggedValue(element, eReferenceStereotype,
 							TAG_DEFINITION__IS_RESOLVE_PROXIES, eReference,
-							EcorePackage.eINSTANCE
-								.getEReference_ResolveProxies(), options,
-							diagnostics, context);
+							EcorePackage.Literals.EREFERENCE__RESOLVE_PROXIES,
+							options, diagnostics, context);
 					}
 
 					return eReferenceStereotype;
@@ -5917,17 +5655,17 @@
 			if (eStructuralFeatureStereotype != null) {
 				processEcoreTaggedValue(element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_TRANSIENT, eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Transient(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__TRANSIENT,
 					options, diagnostics, context);
 
 				processEcoreTaggedValue(element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_UNSETTABLE, eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Unsettable(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__UNSETTABLE,
 					options, diagnostics, context);
 
 				processEcoreTaggedValue(element, eStructuralFeatureStereotype,
 					TAG_DEFINITION__IS_VOLATILE, eStructuralFeature,
-					EcorePackage.eINSTANCE.getEStructuralFeature_Volatile(),
+					EcorePackage.Literals.ESTRUCTURAL_FEATURE__VOLATILE,
 					options, diagnostics, context);
 
 				processEcoreTaggedValue(element, eStructuralFeatureStereotype,
@@ -5948,18 +5686,20 @@
 			}
 		}
 
-		protected void processEcoreTaggedValues(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processEcoreTaggedValues(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = eModelElementToElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
+			for (Map.Entry<EModelElement, Element> entry : eModelElementToElementMap
+				.entrySet()) {
 
-				Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getKey();
-				final Element element = (Element) entry.getValue();
+				EModelElement eModelElement = entry.getKey();
+				final Element element = entry.getValue();
 
-				new EcoreSwitch() {
+				new EcoreSwitch<Object>() {
 
+					@Override
 					public Object caseEClassifier(EClassifier eClassifier) {
 						processEcoreTaggedValues(element, eClassifier, options,
 							diagnostics, context);
@@ -5967,6 +5707,7 @@
 						return eClassifier;
 					}
 
+					@Override
 					public Object caseEDataType(EDataType eDataType) {
 						processEcoreTaggedValues(element, eDataType, options,
 							diagnostics, context);
@@ -5974,6 +5715,7 @@
 						return eDataType;
 					}
 
+					@Override
 					public Object caseEEnum(EEnum eEnum) {
 						Stereotype eEnumStereotype = getEcoreStereotype(eEnum,
 							STEREOTYPE__E_ENUM);
@@ -5985,6 +5727,7 @@
 						return eEnum;
 					}
 
+					@Override
 					public Object caseEEnumLiteral(EEnumLiteral eEnumLiteral) {
 						Stereotype eEnumLiteralStereotype = getEcoreStereotype(
 							eEnumLiteral, STEREOTYPE__E_ENUM_LITERAL);
@@ -5996,6 +5739,7 @@
 						return eEnumLiteral;
 					}
 
+					@Override
 					public Object caseEOperation(EOperation eOperation) {
 						Stereotype eOperationStereotype = getEcoreStereotype(
 							eOperation, STEREOTYPE__E_OPERATION);
@@ -6007,6 +5751,7 @@
 						return eOperation;
 					}
 
+					@Override
 					public Object caseEPackage(EPackage ePackage) {
 						processEcoreTaggedValues(element, ePackage, options,
 							diagnostics, context);
@@ -6014,6 +5759,7 @@
 						return ePackage;
 					}
 
+					@Override
 					public Object caseEParameter(EParameter eParameter) {
 						Stereotype eParameterStereotype = getEcoreStereotype(
 							eParameter, STEREOTYPE__E_PARAMETER);
@@ -6025,6 +5771,7 @@
 						return eParameter;
 					}
 
+					@Override
 					public Object caseEStructuralFeature(
 							EStructuralFeature eStructuralFeature) {
 						processEcoreTaggedValues(element, eStructuralFeature,
@@ -6037,14 +5784,14 @@
 			}
 		}
 
-		protected void processRedefinesAnnotations(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processRedefinesAnnotations(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = eModelElementToElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getKey();
+			for (Map.Entry<EModelElement, Element> entry : eModelElementToElementMap
+				.entrySet()) {
+				EModelElement eModelElement = entry.getKey();
 
 				if (eModelElement instanceof ETypedElement) {
 					EAnnotation redefinesEAnnotation = getEAnnotation(
@@ -6053,11 +5800,11 @@
 					if (redefinesEAnnotation != null) {
 						Feature feature = (Feature) entry.getValue();
 
-						for (Iterator references = redefinesEAnnotation
-							.getReferences().iterator(); references.hasNext();) {
+						for (EObject reference : redefinesEAnnotation
+							.getReferences()) {
 
 							Feature redefinedFeature = (Feature) eModelElementToElementMap
-								.get(references.next());
+								.get(reference);
 
 							if (redefinedFeature != null
 								&& findValidRedefinitions(feature,
@@ -6110,14 +5857,14 @@
 			}
 		}
 
-		protected void processSubsetsAnnotations(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processSubsetsAnnotations(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = eModelElementToElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getKey();
+			for (Map.Entry<EModelElement, Element> entry : eModelElementToElementMap
+				.entrySet()) {
+				EModelElement eModelElement = entry.getKey();
 
 				if (eModelElement instanceof EStructuralFeature) {
 					EAnnotation subsetsEAnnotation = getEAnnotation(
@@ -6126,11 +5873,11 @@
 					if (subsetsEAnnotation != null) {
 						Property property = (Property) entry.getValue();
 
-						for (Iterator references = subsetsEAnnotation
-							.getReferences().iterator(); references.hasNext();) {
+						for (EObject reference : subsetsEAnnotation
+							.getReferences()) {
 
 							Property subsettedProperty = (Property) eModelElementToElementMap
-								.get(references.next());
+								.get(reference);
 
 							if (subsettedProperty != null
 								&& findValidSubsets(property,
@@ -6183,14 +5930,14 @@
 			}
 		}
 
-		protected void processUnionAnnotations(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processUnionAnnotations(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = eModelElementToElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				Map.Entry entry = (Map.Entry) entries.next();
-				EModelElement eModelElement = (EModelElement) entry.getKey();
+			for (Map.Entry<EModelElement, Element> entry : eModelElementToElementMap
+				.entrySet()) {
+				EModelElement eModelElement = entry.getKey();
 
 				if (eModelElement instanceof EStructuralFeature) {
 					EAnnotation unionEAnnotation = getEAnnotation(
@@ -6238,25 +5985,22 @@
 			}
 		}
 
-		protected void processAnnotationDetails(final Map options,
-				final DiagnosticChain diagnostics, final Map context) {
+		protected void processAnnotationDetails(
+				final Map<String, String> options,
+				final DiagnosticChain diagnostics,
+				final Map<Object, Object> context) {
 
-			for (Iterator entries = eModelElementToElementMap.entrySet()
-				.iterator(); entries.hasNext();) {
-
-				final Map.Entry entry = (Map.Entry) entries.next();
-				Element element = (Element) entry.getValue();
+			for (final Map.Entry<EModelElement, Element> entry : eModelElementToElementMap
+				.entrySet()) {
+				Element element = entry.getValue();
 
 				if (element != null) {
-					EModelElement eModelElement = (EModelElement) entry
-						.getKey();
+					EModelElement eModelElement = entry.getKey();
 
-					for (Iterator eAnnotations = eModelElement
-						.getEAnnotations().iterator(); eAnnotations.hasNext();) {
+					for (EAnnotation eAnnotation : eModelElement
+						.getEAnnotations()) {
 
-						EAnnotation eAnnotation = (EAnnotation) eAnnotations
-							.next();
-						EMap details = eAnnotation.getDetails();
+						EMap<String, String> details = eAnnotation.getDetails();
 
 						if (!details.isEmpty()) {
 
@@ -6304,8 +6048,8 @@
 			}
 		}
 
-		protected void processOptions(Map options, DiagnosticChain diagnostics,
-				Map context) {
+		protected void processOptions(Map<String, String> options,
+				DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 			if (!OPTION__IGNORE
 				.equals(options.get(OPTION__ECORE_TAGGED_VALUES))) {
@@ -6334,20 +6078,15 @@
 			}
 		}
 
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.uml2.common.util.UML2Util.Converter#convert(java.util.Collection,
-		 *      java.util.Map, org.eclipse.emf.common.util.DiagnosticChain,
-		 *      java.util.Map)
-		 */
-		public Collection convert(Collection eObjects, Map options,
-				DiagnosticChain diagnostics, Map context) {
+		public Collection<? extends EObject> convert(
+				Collection<? extends EObject> eObjects,
+				Map<String, String> options, DiagnosticChain diagnostics,
+				Map<Object, Object> context) {
 			ePackages = EcoreUtil.getObjectsByType(eObjects,
-				EcorePackage.eINSTANCE.getEPackage());
+				EcorePackage.Literals.EPACKAGE);
 
-			for (Iterator ep = ePackages.iterator(); ep.hasNext();) {
-				doSwitch((EPackage) ep.next());
+			for (EPackage ePackage : ePackages) {
+				doSwitch(ePackage);
 			}
 
 			if (options != null) {
@@ -6355,7 +6094,7 @@
 			}
 
 			return getRootContainers(EcoreUtil
-				.getObjectsByType(eModelElementToElementMap.values(),
+				.<EObject> getObjectsByType(eModelElementToElementMap.values(),
 					UMLPackage.Literals.PACKAGE));
 		}
 	}
@@ -6611,10 +6350,8 @@
 
 		StringBuffer qualifiedName = new StringBuffer(name);
 
-		for (Iterator allNamespaces = namedElement.allNamespaces().iterator(); allNamespaces
-			.hasNext();) {
-
-			String namespaceName = ((Namespace) allNamespaces.next()).getName();
+		for (Namespace namespace : namedElement.allNamespaces()) {
+			String namespaceName = namespace.getName();
 
 			if (isEmpty(namespaceName)) {
 				return null;
@@ -6637,8 +6374,8 @@
 	 *            The qualified name of the element(s) to be found.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(ResourceSet resourceSet,
-			String qualifiedName) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			ResourceSet resourceSet, String qualifiedName) {
 		return findNamedElements(resourceSet, qualifiedName, false);
 	}
 
@@ -6655,8 +6392,8 @@
 	 *            Whether to ignore case when doing name comparisons.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(ResourceSet resourceSet,
-			String qualifiedName, boolean ignoreCase) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			ResourceSet resourceSet, String qualifiedName, boolean ignoreCase) {
 		return findNamedElements(resourceSet, qualifiedName, ignoreCase,
 			UMLPackage.Literals.NAMED_ELEMENT);
 	}
@@ -6676,29 +6413,29 @@
 	 *            The type of the element(s) to be found.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(ResourceSet resourceSet,
-			String qualifiedName, boolean ignoreCase, EClass eClass) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			ResourceSet resourceSet, String qualifiedName, boolean ignoreCase,
+			EClass eClass) {
 
 		if (!isEmpty(qualifiedName)
 			&& UMLPackage.Literals.NAMED_ELEMENT.isSuperTypeOf(eClass)) {
 
-			EList resources = resourceSet.getResources();
+			EList<Resource> resources = resourceSet.getResources();
 			int size = resources.size();
 
 			if (size > 0) {
-				EList namedElements = new UniqueEList.FastCompare();
+				EList<NE> namedElements = new UniqueEList.FastCompare<NE>();
 
 				for (int i = 0; i < size; i++) {
-					findNamedElements(((Resource) resources.get(i))
-						.getContents(), qualifiedName, ignoreCase, eClass,
-						namedElements);
+					findNamedElements(resources.get(i).getContents(),
+						qualifiedName, ignoreCase, eClass, namedElements);
 				}
 
 				return ECollections.unmodifiableEList(namedElements);
 			}
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.<NE> emptyEList();
 	}
 
 	/**
@@ -6711,8 +6448,8 @@
 	 *            The qualified name of the element(s) to be found.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(Resource resource,
-			String qualifiedName) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			Resource resource, String qualifiedName) {
 		return findNamedElements(resource, qualifiedName, false);
 	}
 
@@ -6728,8 +6465,8 @@
 	 *            Whether to ignore case when doing name comparisons.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(Resource resource,
-			String qualifiedName, boolean ignoreCase) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			Resource resource, String qualifiedName, boolean ignoreCase) {
 		return findNamedElements(resource, qualifiedName, ignoreCase,
 			UMLPackage.Literals.NAMED_ELEMENT);
 	}
@@ -6749,16 +6486,17 @@
 	 *            The type of the element(s) to be found.
 	 * @return The named element(s).
 	 */
-	public static Collection findNamedElements(Resource resource,
-			String qualifiedName, boolean ignoreCase, EClass eClass) {
+	public static <NE extends NamedElement> Collection<NE> findNamedElements(
+			Resource resource, String qualifiedName, boolean ignoreCase,
+			EClass eClass) {
 
 		if (!isEmpty(qualifiedName)
 			&& UMLPackage.Literals.NAMED_ELEMENT.isSuperTypeOf(eClass)) {
 
-			EList contents = resource.getContents();
+			EList<EObject> contents = resource.getContents();
 
 			if (!contents.isEmpty()) {
-				EList namedElements = new UniqueEList.FastCompare();
+				EList<NE> namedElements = new UniqueEList.FastCompare<NE>();
 
 				findNamedElements(contents, qualifiedName, ignoreCase, eClass,
 					namedElements);
@@ -6767,21 +6505,17 @@
 			}
 		}
 
-		return ECollections.EMPTY_ELIST;
+		return ECollections.<NE> emptyEList();
 	}
 
-	protected static Collection findNamedElements(Collection eObjects,
-			String qualifiedName, boolean ignoreCase, EClass eClass,
-			Collection namedElements) {
+	protected static <NE extends NamedElement> Collection<NE> findNamedElements(
+			Collection<? extends EObject> eObjects, String qualifiedName,
+			boolean ignoreCase, EClass eClass, Collection<NE> namedElements) {
 		int index = qualifiedName.indexOf(NamedElement.SEPARATOR);
 
 		if (index == -1) {
 
-			for (Iterator members = EcoreUtil
-				.getObjectsByType(eObjects, eClass).iterator(); members
-				.hasNext();) {
-
-				NamedElement member = (NamedElement) members.next();
+			for (NE member : EcoreUtil.<NE> getObjectsByType(eObjects, eClass)) {
 
 				if (ignoreCase
 					? qualifiedName.equalsIgnoreCase(member.getName())
@@ -6795,10 +6529,8 @@
 			qualifiedName = qualifiedName.substring(index
 				+ NamedElement.SEPARATOR.length());
 
-			for (Iterator namespaces = EcoreUtil.getObjectsByType(eObjects,
-				UMLPackage.Literals.NAMESPACE).iterator(); namespaces.hasNext();) {
-
-				Namespace namespace = (Namespace) namespaces.next();
+			for (Namespace namespace : EcoreUtil.<Namespace> getObjectsByType(
+				eObjects, UMLPackage.Literals.NAMESPACE)) {
 
 				if (ignoreCase
 					? name.equalsIgnoreCase(namespace.getName())
@@ -6850,7 +6582,7 @@
 
 			if (model != null) {
 				EPackage ePackage = EPackage.Registry.INSTANCE
-					.getEPackage((String) getTaggedValue(model, "Ecore" // $NON-NLS-1$
+					.getEPackage((String) getTaggedValue(model, "Ecore" //$NON-NLS-1$
 						+ NamedElement.SEPARATOR + STEREOTYPE__E_PACKAGE,
 						TAG_DEFINITION__NS_URI));
 
@@ -6870,10 +6602,10 @@
 				.getEAnnotation(UMLPackage.eNS_URI);
 
 			if (eAnnotation != null) {
-				EList references = eAnnotation.getReferences();
+				EList<EObject> references = eAnnotation.getReferences();
 
 				if (!references.isEmpty()) {
-					Object reference = references.get(0);
+					EObject reference = references.get(0);
 
 					if (reference instanceof Classifier) {
 						return (NamedElement) reference;
@@ -6889,10 +6621,7 @@
 			if (class_ != null) {
 				String name = definition.getName();
 
-				for (Iterator ownedAttributes = class_.getOwnedAttributes()
-					.iterator(); ownedAttributes.hasNext();) {
-
-					Property ownedAttribute = (Property) ownedAttributes.next();
+				for (Property ownedAttribute : class_.getOwnedAttributes()) {
 
 					if (safeEquals(getValidJavaIdentifier(ownedAttribute
 						.getName()), name)) {
@@ -6952,12 +6681,8 @@
 
 			if (getStereotype(eClass) != null) {
 
-				for (Iterator eAllStructuralFeatures = eClass
-					.getEAllStructuralFeatures().iterator(); eAllStructuralFeatures
-					.hasNext();) {
-
-					EStructuralFeature eStructuralFeature = (EStructuralFeature) eAllStructuralFeatures
-						.next();
+				for (EStructuralFeature eStructuralFeature : eClass
+					.getEAllStructuralFeatures()) {
 
 					if (eStructuralFeature.getName().startsWith(
 						Extension.METACLASS_ROLE_PREFIX)) {
@@ -6993,12 +6718,8 @@
 
 			if (getStereotype(eClass) != null) {
 
-				for (Iterator eAllStructuralFeatures = eClass
-					.getEAllStructuralFeatures().iterator(); eAllStructuralFeatures
-					.hasNext();) {
-
-					EStructuralFeature eStructuralFeature = (EStructuralFeature) eAllStructuralFeatures
-						.next();
+				for (EStructuralFeature eStructuralFeature : eClass
+					.getEAllStructuralFeatures()) {
 
 					if (eStructuralFeature.getName().startsWith(
 						Extension.METACLASS_ROLE_PREFIX)
@@ -7055,13 +6776,12 @@
 					if (!nearestPackage.getAllAppliedProfiles().contains(
 						profile)) {
 
-						EList allOwningPackages = nearestPackage
+						EList<org.eclipse.uml2.uml.Package> allOwningPackages = nearestPackage
 							.allOwningPackages();
 						int size = allOwningPackages.size();
 
 						(size > 0
-							? (org.eclipse.uml2.uml.Package) allOwningPackages
-								.get(size - 1)
+							? allOwningPackages.get(size - 1)
 							: nearestPackage).applyProfile(profile);
 					}
 
@@ -7078,14 +6798,12 @@
 	protected static Property getTagDefinition(Stereotype stereotype,
 			final String propertyName) {
 
-		return (Property) findEObject(stereotype.getAllAttributes(),
-			new EObjectMatcher() {
+		return findEObject(stereotype.getAllAttributes(), new EObjectMatcher() {
 
-				public boolean matches(EObject eObject) {
-					return safeEquals(((Property) eObject).getName(),
-						propertyName);
-				}
-			});
+			public boolean matches(EObject eObject) {
+				return safeEquals(((Property) eObject).getName(), propertyName);
+			}
+		});
 	}
 
 	protected static Object getTaggedValue(Element element,
@@ -7124,83 +6842,103 @@
 		return false;
 	}
 
-	protected static EList getOwnedAttributes(Type type) {
+	protected static EList<Property> getOwnedAttributes(Type type) {
+		@SuppressWarnings("unchecked")
+		EList<Property> ownedAttributes = (EList<Property>) new UMLSwitch() {
 
-		return (EList) new UMLSwitch() {
-
+			@Override
 			public Object caseArtifact(Artifact artifact) {
 				return artifact.getOwnedAttributes();
 			}
 
+			@Override
 			public Object caseDataType(DataType dataType) {
 				return dataType.getOwnedAttributes();
 			}
 
+			@Override
 			public Object caseInterface(Interface interface_) {
 				return interface_.getOwnedAttributes();
 			}
 
+			@Override
 			public Object caseSignal(Signal signal) {
 				return signal.getOwnedAttributes();
 			}
 
+			@Override
 			public Object caseStructuredClassifier(
 					StructuredClassifier structuredClassifier) {
 				return structuredClassifier.getOwnedAttributes();
 			}
 
+			@Override
 			public Object doSwitch(EObject eObject) {
 				return eObject == null
 					? null
 					: super.doSwitch(eObject);
 			}
 		}.doSwitch(type);
+
+		return ownedAttributes;
 	}
 
-	protected static EList getOwnedOperations(Type type) {
+	protected static EList<Operation> getOwnedOperations(Type type) {
+		@SuppressWarnings("unchecked")
+		EList<Operation> ownedOperations = (EList<Operation>) new UMLSwitch() {
 
-		return (EList) new UMLSwitch() {
-
+			@Override
 			public Object caseArtifact(Artifact artifact) {
 				return artifact.getOwnedOperations();
 			}
 
+			@Override
 			public Object caseClass(org.eclipse.uml2.uml.Class class_) {
 				return class_.getOwnedOperations();
 			}
 
+			@Override
 			public Object caseDataType(DataType dataType) {
 				return dataType.getOwnedOperations();
 			}
 
+			@Override
 			public Object caseInterface(Interface interface_) {
 				return interface_.getOwnedOperations();
 			}
 
+			@Override
 			public Object doSwitch(EObject eObject) {
 				return eObject == null
 					? null
 					: super.doSwitch(eObject);
 			}
 		}.doSwitch(type);
+
+		return ownedOperations;
 	}
 
-	protected static EList getRedefinedFeatures(Feature feature) {
+	protected static EList<Feature> getRedefinedFeatures(Feature feature) {
+		@SuppressWarnings("unchecked")
+		EList<Feature> redefinedFeatures = (EList<Feature>) new UMLSwitch() {
 
-		return (EList) new UMLSwitch() {
-
+			@Override
 			public Object caseOperation(Operation operation) {
 				return operation.getRedefinedOperations();
 			}
 
+			@Override
 			public Object caseProperty(Property property) {
 				return property.getRedefinedProperties();
 			}
 
+			@Override
 			public Object defaultCase(EObject eObject) {
-				return ECollections.EMPTY_ELIST;
+				return ECollections.<Feature> emptyEList();
 			}
 		}.doSwitch(feature);
+
+		return redefinedFeatures;
 	}
 
 	protected static boolean isRedefinitionValid(Feature redefiningFeature,
@@ -7208,48 +6946,47 @@
 		return redefinedFeature.isConsistentWith(redefiningFeature);
 	}
 
-	protected static Collection findValidRedefinitions(
-			Feature redefiningFeature, String name) {
-		Collection redefinedFeatures = new UniqueEList.FastCompare();
+	protected static <F extends Feature> Collection<F> findValidRedefinitions(
+			F redefiningFeature, String name) {
+		Collection<F> redefinedFeatures = new UniqueEList.FastCompare<F>();
 
-		for (Iterator redefinitionContexts = redefiningFeature
-			.getRedefinitionContexts().iterator(); redefinitionContexts
-			.hasNext();) {
+		for (Classifier redefinitionContext : redefiningFeature
+			.getRedefinitionContexts()) {
 
 			findValidRedefinitions(redefinedFeatures, redefiningFeature, name,
-				(Classifier) redefinitionContexts.next());
+				redefinitionContext);
 		}
 
 		return redefinedFeatures;
 	}
 
-	protected static Collection findValidRedefinitions(
-			Collection redefinedFeatures, Feature redefiningFeature,
+	protected static <F extends Feature> Collection<F> findValidRedefinitions(
+			Collection<F> redefinedFeatures, F redefiningFeature,
 			final String name, Classifier redefinitionContext) {
-		Feature redefinedFeature = (Feature) findEObject(redefinitionContext
-			.getFeatures(), new EClassMatcher(redefiningFeature) {
+		F redefinedFeature = findEObject(redefinitionContext.getFeatures(),
+			new EClassMatcher(redefiningFeature) {
 
-			public boolean matches(EObject otherEObject) {
+				@Override
+				public boolean matches(EObject otherEObject) {
 
-				if (super.matches(otherEObject)) {
-					Feature otherFeature = (Feature) otherEObject;
+					if (super.matches(otherEObject)) {
+						Feature otherFeature = (Feature) otherEObject;
 
-					return eObject != otherFeature
-						&& safeEquals(otherFeature.getName(), name)
-						&& isRedefinitionValid((Feature) eObject, otherFeature);
+						return eObject != otherFeature
+							&& safeEquals(otherFeature.getName(), name)
+							&& isRedefinitionValid((Feature) eObject,
+								otherFeature);
+					}
+
+					return false;
 				}
-
-				return false;
-			}
-		});
+			});
 
 		if (redefinedFeature == null) {
 
-			for (Iterator generals = redefinitionContext.getGenerals()
-				.iterator(); generals.hasNext();) {
-
+			for (Classifier general : redefinitionContext.getGenerals()) {
 				findValidRedefinitions(redefinedFeatures, redefiningFeature,
-					name, (Classifier) generals.next());
+					name, general);
 			}
 		} else {
 			redefinedFeatures.add(redefinedFeature);
@@ -7261,18 +6998,11 @@
 	protected static boolean isSubsetValid(Property subsettingProperty,
 			Property subsettedProperty) {
 
-		for (Iterator subsettingContexts = subsettingProperty
-			.subsettingContext().iterator(); subsettingContexts.hasNext();) {
+		for (Type subsettingContext : subsettingProperty.subsettingContext()) {
 
-			Classifier subsettingContext = (Classifier) subsettingContexts
-				.next();
+			for (Type subsettedContext : subsettedProperty.subsettingContext()) {
 
-			for (Iterator subsettedContexts = subsettedProperty
-				.subsettingContext().iterator(); subsettedContexts.hasNext();) {
-
-				if (!subsettingContext
-					.conformsTo((Classifier) subsettedContexts.next())) {
-
+				if (!subsettingContext.conformsTo(subsettedContext)) {
 					return false;
 				}
 			}
@@ -7281,26 +7011,27 @@
 		return true;
 	}
 
-	protected static Collection findValidSubsets(Property subsettingProperty,
-			String name) {
-		Collection subsettedProperties = new UniqueEList.FastCompare();
+	protected static Collection<Property> findValidSubsets(
+			Property subsettingProperty, String name) {
+		Collection<Property> subsettedProperties = new UniqueEList.FastCompare<Property>();
 
-		for (Iterator subsettingContexts = subsettingProperty
-			.subsettingContext().iterator(); subsettingContexts.hasNext();) {
+		for (Type subsettingContext : subsettingProperty.subsettingContext()) {
 
 			findValidSubsets(subsettedProperties, subsettingProperty, name,
-				(Classifier) subsettingContexts.next());
+				(Classifier) subsettingContext);
 		}
 
 		return subsettedProperties;
 	}
 
-	protected static Collection findValidSubsets(
-			Collection subsettedProperties, Property subsettingProperty,
-			final String name, Classifier subsettingContext) {
-		Property subsettedProperty = (Property) findEObject(subsettingContext
+	protected static Collection<Property> findValidSubsets(
+			Collection<Property> subsettedProperties,
+			Property subsettingProperty, final String name,
+			Classifier subsettingContext) {
+		Property subsettedProperty = findEObject(subsettingContext
 			.getAttributes(), new EClassMatcher(subsettingProperty) {
 
+			@Override
 			public boolean matches(EObject otherEObject) {
 
 				if (super.matches(otherEObject)) {
@@ -7317,11 +7048,9 @@
 
 		if (subsettedProperty == null) {
 
-			for (Iterator generals = subsettingContext.getGenerals().iterator(); generals
-				.hasNext();) {
-
+			for (Classifier general : subsettingContext.getGenerals()) {
 				findValidSubsets(subsettedProperties, subsettingProperty, name,
-					(Classifier) generals.next());
+					general);
 			}
 		} else {
 			subsettedProperties.add(subsettedProperty);
@@ -7340,10 +7069,11 @@
 	 * @param options
 	 *            The options to use.
 	 */
-	public static void merge(org.eclipse.uml2.uml.Package package_, Map options) {
+	public static void merge(org.eclipse.uml2.uml.Package package_,
+			Map<String, String> options) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7415,10 +7145,11 @@
 	 *            The cache of context-specific information.
 	 */
 	public static void merge(org.eclipse.uml2.uml.Package package_,
-			Map options, DiagnosticChain diagnostics, Map context) {
+			Map<String, String> options, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7485,11 +7216,11 @@
 	 *            The options to use.
 	 * @return An Ecore representation of the package.
 	 */
-	public static Collection convertToEcore(
-			org.eclipse.uml2.uml.Package package_, Map options) {
+	public static Collection<EPackage> convertToEcore(
+			org.eclipse.uml2.uml.Package package_, Map<String, String> options) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7587,12 +7318,12 @@
 	 *            The cache of context-specific information.
 	 * @return An Ecore representation of the package.
 	 */
-	public static Collection convertToEcore(
-			org.eclipse.uml2.uml.Package package_, Map options,
-			DiagnosticChain diagnostics, Map context) {
+	public static Collection<EPackage> convertToEcore(
+			org.eclipse.uml2.uml.Package package_, Map<String, String> options,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7671,8 +7402,12 @@
 				OPTION__REPORT);
 		}
 
-		return new UML2EcoreConverter().convert(
-			Collections.singleton(package_), options, diagnostics, context);
+		@SuppressWarnings("unchecked")
+		Collection<EPackage> ePackages = (Collection<EPackage>) new UML2EcoreConverter()
+			.convert(Collections.singletonList(package_), options, diagnostics,
+				context);
+
+		return ePackages;
 	}
 
 	/**
@@ -7686,10 +7421,11 @@
 	 *            The options to use.
 	 * @return An Ecore representation of the profile.
 	 */
-	public static Collection convertToEcore(Profile profile, Map options) {
+	public static Collection<EPackage> convertToEcore(Profile profile,
+			Map<String, String> options) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7787,11 +7523,12 @@
 	 *            The cache of context-specific information.
 	 * @return An Ecore representation of the profile.
 	 */
-	public static Collection convertToEcore(Profile profile, Map options,
-			DiagnosticChain diagnostics, Map context) {
+	public static Collection<EPackage> convertToEcore(Profile profile,
+			Map<String, String> options, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		if (!options
@@ -7870,14 +7607,16 @@
 				OPTION__REPORT);
 		}
 
-		Collection ePackages = new Profile2EPackageConverter().convert(
-			Collections.singleton(profile), options, null, null);
+		@SuppressWarnings("unchecked")
+		Collection<EPackage> ePackages = (Collection<EPackage>) new Profile2EPackageConverter()
+			.convert(Collections.singleton(profile), options, null, null);
 
-		for (Iterator allContents = EcoreUtil.getAllContents(ePackages); allContents
-			.hasNext();) {
+		for (TreeIterator<EObject> allContents = EcoreUtil
+			.getAllContents(ePackages); allContents.hasNext();) {
 
-			new EcoreSwitch() {
+			new EcoreSwitch<Object>() {
 
+				@Override
 				public Object caseEAttribute(EAttribute eAttribute) {
 
 					try {
@@ -7889,6 +7628,7 @@
 					return eAttribute;
 				}
 
+				@Override
 				public Object caseEDataType(EDataType eDataType) {
 
 					try {
@@ -7902,7 +7642,7 @@
 					return eDataType;
 				}
 
-			}.doSwitch((EObject) allContents.next());
+			}.doSwitch(allContents.next());
 		}
 
 		return ePackages;
@@ -7918,10 +7658,11 @@
 	 *            The options to use.
 	 * @return A UML representation of the Ecore package.
 	 */
-	public static Collection convertFromEcore(EPackage ePackage, Map options) {
+	public static Collection<org.eclipse.uml2.uml.Package> convertFromEcore(
+			EPackage ePackage, Map<String, String> options) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
 		return convertFromEcore(ePackage, options, null, null);
@@ -7942,15 +7683,19 @@
 	 *            The cache of context-specific information.
 	 * @return A UML representation of the Ecore package.
 	 */
-	public static Collection convertFromEcore(EPackage ePackage, Map options,
-			DiagnosticChain diagnostics, Map context) {
+	public static Collection<org.eclipse.uml2.uml.Package> convertFromEcore(
+			EPackage ePackage, Map<String, String> options,
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 
 		if (options == null) {
-			options = new HashMap();
+			options = new HashMap<String, String>();
 		}
 
-		return new Ecore2UMLConverter().convert(
-			Collections.singleton(ePackage), options, diagnostics, context);
+		@SuppressWarnings("unchecked")
+		Collection<org.eclipse.uml2.uml.Package> packages = (Collection<org.eclipse.uml2.uml.Package>) new Ecore2UMLConverter()
+			.convert(Collections.singleton(ePackage), options, diagnostics,
+				context);
+		return packages;
 	}
 
 }
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLValidator.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLValidator.java
index 416c7eb..ebfefa9 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLValidator.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLValidator.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *
- * $Id: UMLValidator.java,v 1.16 2006/05/16 15:07:26 khussey Exp $
+ * $Id: UMLValidator.java,v 1.17 2006/12/14 15:49:34 khussey Exp $
  */
 package org.eclipse.uml2.uml.util;
 
@@ -3559,6 +3559,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected EPackage getEPackage() {
 		return UMLPackage.eINSTANCE;
 	}
@@ -3569,8 +3570,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	protected boolean validate(int classifierID, Object value,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		switch (classifierID) {
 			case UMLPackage.COMMENT :
 				return validateComment((Comment) value, diagnostics, context);
@@ -4337,7 +4339,7 @@
 	 * @generated
 	 */
 	public boolean validateComment(Comment comment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(comment,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4363,7 +4365,7 @@
 	 * @generated
 	 */
 	public boolean validateElement(Element element,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(element,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4390,7 +4392,7 @@
 	 * @generated
 	 */
 	public boolean validateElement_validateNotOwnSelf(Element element,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return element.validateNotOwnSelf(diagnostics, context);
 	}
 
@@ -4401,7 +4403,7 @@
 	 * @generated
 	 */
 	public boolean validateElement_validateHasOwner(Element element,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return element.validateHasOwner(diagnostics, context);
 	}
 
@@ -4412,7 +4414,7 @@
 	 */
 	public boolean validateDirectedRelationship(
 			DirectedRelationship directedRelationship,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			directedRelationship, diagnostics, context);
 		if (result || diagnostics != null)
@@ -4439,7 +4441,7 @@
 	 * @generated
 	 */
 	public boolean validateRelationship(Relationship relationship,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(relationship,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4467,7 +4469,7 @@
 	 */
 	public boolean validateLiteralSpecification(
 			LiteralSpecification literalSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			literalSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -4504,7 +4506,7 @@
 	 */
 	public boolean validateValueSpecification(
 			ValueSpecification valueSpecification, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(valueSpecification,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4540,7 +4542,7 @@
 	 * @generated
 	 */
 	public boolean validateTypedElement(TypedElement typedElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(typedElement,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4576,7 +4578,7 @@
 	 * @generated
 	 */
 	public boolean validateNamedElement(NamedElement namedElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(namedElement,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4613,7 +4615,8 @@
 	 * @generated
 	 */
 	public boolean validateNamedElement_validateHasNoQualifiedName(
-			NamedElement namedElement, DiagnosticChain diagnostics, Map context) {
+			NamedElement namedElement, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return namedElement.validateHasNoQualifiedName(diagnostics, context);
 	}
 
@@ -4624,7 +4627,8 @@
 	 * @generated
 	 */
 	public boolean validateNamedElement_validateHasQualifiedName(
-			NamedElement namedElement, DiagnosticChain diagnostics, Map context) {
+			NamedElement namedElement, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return namedElement.validateHasQualifiedName(diagnostics, context);
 	}
 
@@ -4635,7 +4639,8 @@
 	 * @generated
 	 */
 	public boolean validateNamedElement_validateVisibilityNeedsOwnership(
-			NamedElement namedElement, DiagnosticChain diagnostics, Map context) {
+			NamedElement namedElement, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return namedElement.validateVisibilityNeedsOwnership(diagnostics,
 			context);
 	}
@@ -4646,7 +4651,7 @@
 	 * @generated
 	 */
 	public boolean validateDependency(Dependency dependency,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(dependency,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4683,7 +4688,7 @@
 	 */
 	public boolean validatePackageableElement(
 			PackageableElement packageableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(packageableElement,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4720,7 +4725,7 @@
 	 */
 	public boolean validateParameterableElement(
 			ParameterableElement parameterableElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			parameterableElement, diagnostics, context);
 		if (result || diagnostics != null)
@@ -4748,7 +4753,7 @@
 	 */
 	public boolean validateTemplateParameter(
 			TemplateParameter templateParameter, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(templateParameter,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4780,7 +4785,7 @@
 	 */
 	public boolean validateTemplateParameter_validateMustBeCompatible(
 			TemplateParameter templateParameter, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return templateParameter.validateMustBeCompatible(diagnostics, context);
 	}
 
@@ -4791,7 +4796,7 @@
 	 */
 	public boolean validateTemplateSignature(
 			TemplateSignature templateSignature, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(templateSignature,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4823,7 +4828,7 @@
 	 */
 	public boolean validateTemplateSignature_validateOwnElements(
 			TemplateSignature templateSignature, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return templateSignature.validateOwnElements(diagnostics, context);
 	}
 
@@ -4834,7 +4839,7 @@
 	 */
 	public boolean validateTemplateableElement(
 			TemplateableElement templateableElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			templateableElement, diagnostics, context);
 		if (result || diagnostics != null)
@@ -4861,7 +4866,7 @@
 	 * @generated
 	 */
 	public boolean validateTemplateBinding(TemplateBinding templateBinding,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(templateBinding,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -4896,7 +4901,7 @@
 	 */
 	public boolean validateTemplateBinding_validateParameterSubstitutionFormal(
 			TemplateBinding templateBinding, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return templateBinding.validateParameterSubstitutionFormal(diagnostics,
 			context);
 	}
@@ -4909,7 +4914,7 @@
 	 */
 	public boolean validateTemplateBinding_validateOneParameterSubstitution(
 			TemplateBinding templateBinding, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return templateBinding.validateOneParameterSubstitution(diagnostics,
 			context);
 	}
@@ -4921,7 +4926,7 @@
 	 */
 	public boolean validateTemplateParameterSubstitution(
 			TemplateParameterSubstitution templateParameterSubstitution,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			templateParameterSubstitution, diagnostics, context);
 		if (result || diagnostics != null)
@@ -4953,7 +4958,7 @@
 	 */
 	public boolean validateTemplateParameterSubstitution_validateMustBeCompatible(
 			TemplateParameterSubstitution templateParameterSubstitution,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return templateParameterSubstitution.validateMustBeCompatible(
 			diagnostics, context);
 	}
@@ -4964,7 +4969,7 @@
 	 * @generated
 	 */
 	public boolean validateNamespace(Namespace namespace,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(namespace,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5004,7 +5009,8 @@
 	 * @generated
 	 */
 	public boolean validateNamespace_validateMembersDistinguishable(
-			Namespace namespace, DiagnosticChain diagnostics, Map context) {
+			Namespace namespace, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return namespace.validateMembersDistinguishable(diagnostics, context);
 	}
 
@@ -5014,7 +5020,7 @@
 	 * @generated
 	 */
 	public boolean validateElementImport(ElementImport elementImport,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(elementImport,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5049,7 +5055,7 @@
 	 */
 	public boolean validateElementImport_validateVisibilityPublicOrPrivate(
 			ElementImport elementImport, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return elementImport.validateVisibilityPublicOrPrivate(diagnostics,
 			context);
 	}
@@ -5062,7 +5068,7 @@
 	 */
 	public boolean validateElementImport_validateImportedElementIsPublic(
 			ElementImport elementImport, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return elementImport.validateImportedElementIsPublic(diagnostics,
 			context);
 	}
@@ -5073,7 +5079,7 @@
 	 * @generated
 	 */
 	public boolean validatePackageImport(PackageImport packageImport,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(packageImport,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5105,7 +5111,7 @@
 	 */
 	public boolean validatePackageImport_validatePublicOrPrivate(
 			PackageImport packageImport, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return packageImport.validatePublicOrPrivate(diagnostics, context);
 	}
 
@@ -5115,7 +5121,7 @@
 	 * @generated
 	 */
 	public boolean validatePackage(org.eclipse.uml2.uml.Package package_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(package_,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5159,7 +5165,7 @@
 	 */
 	public boolean validatePackage_validateElementsPublicOrPrivate(
 			org.eclipse.uml2.uml.Package package_, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return package_.validateElementsPublicOrPrivate(diagnostics, context);
 	}
 
@@ -5169,7 +5175,7 @@
 	 * @generated
 	 */
 	public boolean validatePackageMerge(PackageMerge packageMerge,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(packageMerge,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5196,7 +5202,7 @@
 	 * @generated
 	 */
 	public boolean validateType(Type type, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(type, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -5232,7 +5238,7 @@
 	 */
 	public boolean validateProfileApplication(
 			ProfileApplication profileApplication, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(profileApplication,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5259,7 +5265,7 @@
 	 * @generated
 	 */
 	public boolean validateProfile(Profile profile,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(profile,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5307,7 +5313,8 @@
 	 * @generated
 	 */
 	public boolean validateProfile_validateMetaclassReferenceNotSpecialized(
-			Profile profile, DiagnosticChain diagnostics, Map context) {
+			Profile profile, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return profile.validateMetaclassReferenceNotSpecialized(diagnostics,
 			context);
 	}
@@ -5319,7 +5326,8 @@
 	 * @generated
 	 */
 	public boolean validateProfile_validateReferencesSameMetamodel(
-			Profile profile, DiagnosticChain diagnostics, Map context) {
+			Profile profile, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return profile.validateReferencesSameMetamodel(diagnostics, context);
 	}
 
@@ -5329,7 +5337,7 @@
 	 * @generated
 	 */
 	public boolean validateStereotype(Stereotype stereotype,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(stereotype,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5402,7 +5410,8 @@
 	 * @generated
 	 */
 	public boolean validateStereotype_validateNameNotClash(
-			Stereotype stereotype, DiagnosticChain diagnostics, Map context) {
+			Stereotype stereotype, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return stereotype.validateNameNotClash(diagnostics, context);
 	}
 
@@ -5413,7 +5422,7 @@
 	 * @generated
 	 */
 	public boolean validateStereotype_validateGeneralize(Stereotype stereotype,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return stereotype.validateGeneralize(diagnostics, context);
 	}
 
@@ -5423,7 +5432,7 @@
 	 * @generated
 	 */
 	public boolean validateClass(org.eclipse.uml2.uml.Class class_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(class_,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5490,7 +5499,7 @@
 	 */
 	public boolean validateClass_validatePassiveClass(
 			org.eclipse.uml2.uml.Class class_, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return class_.validatePassiveClass(diagnostics, context);
 	}
 
@@ -5501,7 +5510,7 @@
 	 */
 	public boolean validateBehavioredClassifier(
 			BehavioredClassifier behavioredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			behavioredClassifier, diagnostics, context);
 		if (result || diagnostics != null)
@@ -5563,7 +5572,7 @@
 	 */
 	public boolean validateBehavioredClassifier_validateClassBehavior(
 			BehavioredClassifier behavioredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return behavioredClassifier.validateClassBehavior(diagnostics, context);
 	}
 
@@ -5573,7 +5582,7 @@
 	 * @generated
 	 */
 	public boolean validateClassifier(Classifier classifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(classifier,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5631,7 +5640,8 @@
 	 * @generated
 	 */
 	public boolean validateClassifier_validateNoCyclesInGeneralization(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return classifier
 			.validateNoCyclesInGeneralization(diagnostics, context);
 	}
@@ -5643,7 +5653,8 @@
 	 * @generated
 	 */
 	public boolean validateClassifier_validateSpecializeType(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return classifier.validateSpecializeType(diagnostics, context);
 	}
 
@@ -5654,7 +5665,8 @@
 	 * @generated
 	 */
 	public boolean validateClassifier_validateGeneralizationHierarchies(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return classifier.validateGeneralizationHierarchies(diagnostics,
 			context);
 	}
@@ -5666,7 +5678,8 @@
 	 * @generated
 	 */
 	public boolean validateClassifier_validateMapsToGeneralizationSet(
-			Classifier classifier, DiagnosticChain diagnostics, Map context) {
+			Classifier classifier, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return classifier.validateMapsToGeneralizationSet(diagnostics, context);
 	}
 
@@ -5677,7 +5690,7 @@
 	 */
 	public boolean validateRedefinableElement(
 			RedefinableElement redefinableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(redefinableElement,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5721,7 +5734,7 @@
 	 */
 	public boolean validateRedefinableElement_validateRedefinitionContextValid(
 			RedefinableElement redefinableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return redefinableElement.validateRedefinitionContextValid(diagnostics,
 			context);
 	}
@@ -5734,7 +5747,7 @@
 	 */
 	public boolean validateRedefinableElement_validateRedefinitionConsistent(
 			RedefinableElement redefinableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return redefinableElement.validateRedefinitionConsistent(diagnostics,
 			context);
 	}
@@ -5745,7 +5758,7 @@
 	 * @generated
 	 */
 	public boolean validateGeneralization(Generalization generalization,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(generalization,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5777,7 +5790,7 @@
 	 */
 	public boolean validateGeneralization_validateGeneralizationSameClassifier(
 			Generalization generalization, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return generalization.validateGeneralizationSameClassifier(diagnostics,
 			context);
 	}
@@ -5789,7 +5802,7 @@
 	 */
 	public boolean validateGeneralizationSet(
 			GeneralizationSet generalizationSet, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(generalizationSet,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5833,7 +5846,7 @@
 	 */
 	public boolean validateGeneralizationSet_validateGeneralizationSameClassifier(
 			GeneralizationSet generalizationSet, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return generalizationSet.validateGeneralizationSameClassifier(
 			diagnostics, context);
 	}
@@ -5846,7 +5859,7 @@
 	 */
 	public boolean validateGeneralizationSet_validateMapsToGeneralizationSet(
 			GeneralizationSet generalizationSet, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return generalizationSet.validateMapsToGeneralizationSet(diagnostics,
 			context);
 	}
@@ -5857,7 +5870,7 @@
 	 * @generated
 	 */
 	public boolean validateFeature(Feature feature,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(feature,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5898,7 +5911,7 @@
 	 * @generated
 	 */
 	public boolean validateUseCase(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(useCase,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -5970,7 +5983,7 @@
 	 * @generated
 	 */
 	public boolean validateUseCase_validateMustHaveName(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return useCase.validateMustHaveName(diagnostics, context);
 	}
 
@@ -5981,7 +5994,7 @@
 	 * @generated
 	 */
 	public boolean validateUseCase_validateBinaryAssociations(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return useCase.validateBinaryAssociations(diagnostics, context);
 	}
 
@@ -5992,7 +6005,8 @@
 	 * @generated
 	 */
 	public boolean validateUseCase_validateNoAssociationToUseCase(
-			UseCase useCase, DiagnosticChain diagnostics, Map context) {
+			UseCase useCase, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return useCase.validateNoAssociationToUseCase(diagnostics, context);
 	}
 
@@ -6003,7 +6017,7 @@
 	 * @generated
 	 */
 	public boolean validateUseCase_validateCannotIncludeSelf(UseCase useCase,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return useCase.validateCannotIncludeSelf(diagnostics, context);
 	}
 
@@ -6013,7 +6027,7 @@
 	 * @generated
 	 */
 	public boolean validateInclude(Include include,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(include,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6048,7 +6062,7 @@
 	 * @generated
 	 */
 	public boolean validateExtend(Extend extend, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(extend,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6087,7 +6101,7 @@
 	 * @generated
 	 */
 	public boolean validateExtend_validateExtensionPoints(Extend extend,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return extend.validateExtensionPoints(diagnostics, context);
 	}
 
@@ -6097,7 +6111,7 @@
 	 * @generated
 	 */
 	public boolean validateConstraint(Constraint constraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(constraint,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6149,7 +6163,8 @@
 	 * @generated
 	 */
 	public boolean validateConstraint_validateNotApplyToSelf(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return constraint.validateNotApplyToSelf(diagnostics, context);
 	}
 
@@ -6160,7 +6175,8 @@
 	 * @generated
 	 */
 	public boolean validateConstraint_validateValueSpecificationBoolean(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return constraint.validateValueSpecificationBoolean(diagnostics,
 			context);
 	}
@@ -6172,7 +6188,8 @@
 	 * @generated
 	 */
 	public boolean validateConstraint_validateBooleanValue(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return constraint.validateBooleanValue(diagnostics, context);
 	}
 
@@ -6183,7 +6200,8 @@
 	 * @generated
 	 */
 	public boolean validateConstraint_validateNoSideEffects(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return constraint.validateNoSideEffects(diagnostics, context);
 	}
 
@@ -6194,7 +6212,8 @@
 	 * @generated
 	 */
 	public boolean validateConstraint_validateNotAppliedToSelf(
-			Constraint constraint, DiagnosticChain diagnostics, Map context) {
+			Constraint constraint, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return constraint.validateNotAppliedToSelf(diagnostics, context);
 	}
 
@@ -6204,7 +6223,7 @@
 	 * @generated
 	 */
 	public boolean validateExtensionPoint(ExtensionPoint extensionPoint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(extensionPoint,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6251,7 +6270,7 @@
 	 */
 	public boolean validateExtensionPoint_validateMustHaveName(
 			ExtensionPoint extensionPoint, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return extensionPoint.validateMustHaveName(diagnostics, context);
 	}
 
@@ -6261,7 +6280,7 @@
 	 * @generated
 	 */
 	public boolean validateSubstitution(Substitution substitution,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(substitution,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6297,7 +6316,7 @@
 	 * @generated
 	 */
 	public boolean validateRealization(Realization realization,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(realization,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6333,7 +6352,7 @@
 	 * @generated
 	 */
 	public boolean validateAbstraction(Abstraction abstraction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(abstraction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6369,7 +6388,7 @@
 	 * @generated
 	 */
 	public boolean validateOpaqueExpression(OpaqueExpression opaqueExpression,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(opaqueExpression,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6416,7 +6435,7 @@
 	 */
 	public boolean validateOpaqueExpression_validateLanguageBodySize(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return opaqueExpression.validateLanguageBodySize(diagnostics, context);
 	}
 
@@ -6428,7 +6447,7 @@
 	 */
 	public boolean validateOpaqueExpression_validateOnlyReturnResultParameters(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return opaqueExpression.validateOnlyReturnResultParameters(diagnostics,
 			context);
 	}
@@ -6441,7 +6460,7 @@
 	 */
 	public boolean validateOpaqueExpression_validateOneReturnResultParameter(
 			OpaqueExpression opaqueExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return opaqueExpression.validateOneReturnResultParameter(diagnostics,
 			context);
 	}
@@ -6452,7 +6471,7 @@
 	 * @generated
 	 */
 	public boolean validateParameter(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(parameter,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6519,7 +6538,7 @@
 	 * @generated
 	 */
 	public boolean validateParameter_validateConnectorEnd(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return parameter.validateConnectorEnd(diagnostics, context);
 	}
 
@@ -6530,7 +6549,8 @@
 	 * @generated
 	 */
 	public boolean validateParameter_validateStreamAndException(
-			Parameter parameter, DiagnosticChain diagnostics, Map context) {
+			Parameter parameter, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return parameter.validateStreamAndException(diagnostics, context);
 	}
 
@@ -6541,7 +6561,7 @@
 	 * @generated
 	 */
 	public boolean validateParameter_validateNotException(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return parameter.validateNotException(diagnostics, context);
 	}
 
@@ -6552,7 +6572,8 @@
 	 * @generated
 	 */
 	public boolean validateParameter_validateReentrantBehaviors(
-			Parameter parameter, DiagnosticChain diagnostics, Map context) {
+			Parameter parameter, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return parameter.validateReentrantBehaviors(diagnostics, context);
 	}
 
@@ -6563,7 +6584,7 @@
 	 * @generated
 	 */
 	public boolean validateParameter_validateInAndOut(Parameter parameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return parameter.validateInAndOut(diagnostics, context);
 	}
 
@@ -6574,7 +6595,7 @@
 	 */
 	public boolean validateMultiplicityElement(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			multiplicityElement, diagnostics, context);
 		if (result || diagnostics != null)
@@ -6618,7 +6639,7 @@
 	 */
 	public boolean validateMultiplicityElement_validateUpperGt0(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return multiplicityElement.validateUpperGt0(diagnostics, context);
 	}
 
@@ -6630,7 +6651,7 @@
 	 */
 	public boolean validateMultiplicityElement_validateLowerGe0(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return multiplicityElement.validateLowerGe0(diagnostics, context);
 	}
 
@@ -6642,7 +6663,7 @@
 	 */
 	public boolean validateMultiplicityElement_validateUpperGeLower(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return multiplicityElement.validateUpperGeLower(diagnostics, context);
 	}
 
@@ -6654,7 +6675,7 @@
 	 */
 	public boolean validateMultiplicityElement_validateValueSpecificationNoSideEffects(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return multiplicityElement.validateValueSpecificationNoSideEffects(
 			diagnostics, context);
 	}
@@ -6667,7 +6688,7 @@
 	 */
 	public boolean validateMultiplicityElement_validateValueSpecificationConstant(
 			MultiplicityElement multiplicityElement,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return multiplicityElement.validateValueSpecificationConstant(
 			diagnostics, context);
 	}
@@ -6679,7 +6700,7 @@
 	 */
 	public boolean validateConnectableElement(
 			ConnectableElement connectableElement, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(connectableElement,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6715,7 +6736,7 @@
 	 * @generated
 	 */
 	public boolean validateConnectorEnd(ConnectorEnd connectorEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(connectorEnd,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6770,7 +6791,8 @@
 	 * @generated
 	 */
 	public boolean validateConnectorEnd_validateMultiplicity(
-			ConnectorEnd connectorEnd, DiagnosticChain diagnostics, Map context) {
+			ConnectorEnd connectorEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connectorEnd.validateMultiplicity(diagnostics, context);
 	}
 
@@ -6781,7 +6803,8 @@
 	 * @generated
 	 */
 	public boolean validateConnectorEnd_validatePartWithPortEmpty(
-			ConnectorEnd connectorEnd, DiagnosticChain diagnostics, Map context) {
+			ConnectorEnd connectorEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connectorEnd.validatePartWithPortEmpty(diagnostics, context);
 	}
 
@@ -6792,7 +6815,8 @@
 	 * @generated
 	 */
 	public boolean validateConnectorEnd_validateRoleAndPartWithPort(
-			ConnectorEnd connectorEnd, DiagnosticChain diagnostics, Map context) {
+			ConnectorEnd connectorEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connectorEnd.validateRoleAndPartWithPort(diagnostics, context);
 	}
 
@@ -6803,7 +6827,8 @@
 	 * @generated
 	 */
 	public boolean validateConnectorEnd_validateSelfPartWithPort(
-			ConnectorEnd connectorEnd, DiagnosticChain diagnostics, Map context) {
+			ConnectorEnd connectorEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connectorEnd.validateSelfPartWithPort(diagnostics, context);
 	}
 
@@ -6813,7 +6838,7 @@
 	 * @generated
 	 */
 	public boolean validateProperty(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(property,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -6901,7 +6926,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateMultiplicityOfComposite(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateMultiplicityOfComposite(diagnostics, context);
 	}
 
@@ -6912,7 +6938,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateSubsettingContextConforms(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateSubsettingContextConforms(diagnostics, context);
 	}
 
@@ -6923,7 +6950,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateRedefinedPropertyInherited(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property
 			.validateRedefinedPropertyInherited(diagnostics, context);
 	}
@@ -6935,7 +6963,7 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateSubsettingRules(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return property.validateSubsettingRules(diagnostics, context);
 	}
 
@@ -6946,7 +6974,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateNavigableReadonly(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateNavigableReadonly(diagnostics, context);
 	}
 
@@ -6957,7 +6986,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateDerivedUnionIsDerived(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateDerivedUnionIsDerived(diagnostics, context);
 	}
 
@@ -6968,7 +6998,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateDerivedUnionIsReadOnly(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateDerivedUnionIsReadOnly(diagnostics, context);
 	}
 
@@ -6979,7 +7010,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateSubsettedPropertyNames(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateSubsettedPropertyNames(diagnostics, context);
 	}
 
@@ -6990,7 +7022,7 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateDeploymentTarget(Property property,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return property.validateDeploymentTarget(diagnostics, context);
 	}
 
@@ -7001,7 +7033,8 @@
 	 * @generated
 	 */
 	public boolean validateProperty_validateBindingToAttribute(
-			Property property, DiagnosticChain diagnostics, Map context) {
+			Property property, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return property.validateBindingToAttribute(diagnostics, context);
 	}
 
@@ -7011,7 +7044,7 @@
 	 * @generated
 	 */
 	public boolean validateDeploymentTarget(DeploymentTarget deploymentTarget,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(deploymentTarget,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7047,7 +7080,7 @@
 	 * @generated
 	 */
 	public boolean validateDeployment(Deployment deployment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(deployment,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7083,7 +7116,7 @@
 	 * @generated
 	 */
 	public boolean validateDeployedArtifact(DeployedArtifact deployedArtifact,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(deployedArtifact,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7120,7 +7153,7 @@
 	 */
 	public boolean validateDeploymentSpecification(
 			DeploymentSpecification deploymentSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			deploymentSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -7185,7 +7218,7 @@
 	 */
 	public boolean validateDeploymentSpecification_validateDeployedElements(
 			DeploymentSpecification deploymentSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return deploymentSpecification.validateDeployedElements(diagnostics,
 			context);
 	}
@@ -7198,7 +7231,7 @@
 	 */
 	public boolean validateDeploymentSpecification_validateDeploymentTarget(
 			DeploymentSpecification deploymentSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return deploymentSpecification.validateDeploymentTarget(diagnostics,
 			context);
 	}
@@ -7209,7 +7242,7 @@
 	 * @generated
 	 */
 	public boolean validateArtifact(Artifact artifact,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(artifact,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7266,7 +7299,7 @@
 	 * @generated
 	 */
 	public boolean validateManifestation(Manifestation manifestation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(manifestation,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7302,7 +7335,7 @@
 	 * @generated
 	 */
 	public boolean validateOperation(Operation operation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(operation,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7354,7 +7387,8 @@
 	 * @generated
 	 */
 	public boolean validateOperation_validateAtMostOneReturn(
-			Operation operation, DiagnosticChain diagnostics, Map context) {
+			Operation operation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return operation.validateAtMostOneReturn(diagnostics, context);
 	}
 
@@ -7365,7 +7399,8 @@
 	 * @generated
 	 */
 	public boolean validateOperation_validateOnlyBodyForQuery(
-			Operation operation, DiagnosticChain diagnostics, Map context) {
+			Operation operation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return operation.validateOnlyBodyForQuery(diagnostics, context);
 	}
 
@@ -7376,7 +7411,7 @@
 	 */
 	public boolean validateBehavioralFeature(
 			BehavioralFeature behavioralFeature, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(behavioralFeature,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7421,7 +7456,7 @@
 	 * @generated
 	 */
 	public boolean validateBehavior(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(behavior,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7500,7 +7535,7 @@
 	 * @generated
 	 */
 	public boolean validateBehavior_validateParametersMatch(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return behavior.validateParametersMatch(diagnostics, context);
 	}
 
@@ -7511,7 +7546,8 @@
 	 * @generated
 	 */
 	public boolean validateBehavior_validateFeatureOfContextClassifier(
-			Behavior behavior, DiagnosticChain diagnostics, Map context) {
+			Behavior behavior, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return behavior
 			.validateFeatureOfContextClassifier(diagnostics, context);
 	}
@@ -7523,7 +7559,7 @@
 	 * @generated
 	 */
 	public boolean validateBehavior_validateMustRealize(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return behavior.validateMustRealize(diagnostics, context);
 	}
 
@@ -7534,7 +7570,7 @@
 	 * @generated
 	 */
 	public boolean validateBehavior_validateMostOneBehaviour(Behavior behavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return behavior.validateMostOneBehaviour(diagnostics, context);
 	}
 
@@ -7544,7 +7580,7 @@
 	 * @generated
 	 */
 	public boolean validateParameterSet(ParameterSet parameterSet,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(parameterSet,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7590,7 +7626,8 @@
 	 * @generated
 	 */
 	public boolean validateParameterSet_validateSameParameterizedEntity(
-			ParameterSet parameterSet, DiagnosticChain diagnostics, Map context) {
+			ParameterSet parameterSet, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return parameterSet.validateSameParameterizedEntity(diagnostics,
 			context);
 	}
@@ -7602,7 +7639,8 @@
 	 * @generated
 	 */
 	public boolean validateParameterSet_validateInput(
-			ParameterSet parameterSet, DiagnosticChain diagnostics, Map context) {
+			ParameterSet parameterSet, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return parameterSet.validateInput(diagnostics, context);
 	}
 
@@ -7613,7 +7651,8 @@
 	 * @generated
 	 */
 	public boolean validateParameterSet_validateTwoParameterSets(
-			ParameterSet parameterSet, DiagnosticChain diagnostics, Map context) {
+			ParameterSet parameterSet, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return parameterSet.validateTwoParameterSets(diagnostics, context);
 	}
 
@@ -7623,7 +7662,7 @@
 	 * @generated
 	 */
 	public boolean validateDataType(DataType dataType,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(dataType,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7680,7 +7719,7 @@
 	 * @generated
 	 */
 	public boolean validateInterface(Interface interface_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(interface_,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7741,7 +7780,7 @@
 	 * @generated
 	 */
 	public boolean validateInterface_validateVisibility(Interface interface_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interface_.validateVisibility(diagnostics, context);
 	}
 
@@ -7751,7 +7790,7 @@
 	 * @generated
 	 */
 	public boolean validateReception(Reception reception,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(reception,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7800,7 +7839,7 @@
 	 * @generated
 	 */
 	public boolean validateReception_validateNotQuery(Reception reception,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return reception.validateNotQuery(diagnostics, context);
 	}
 
@@ -7810,7 +7849,7 @@
 	 * @generated
 	 */
 	public boolean validateSignal(Signal signal, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(signal,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -7867,7 +7906,7 @@
 	 */
 	public boolean validateProtocolStateMachine(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			protocolStateMachine, diagnostics, context);
 		if (result || diagnostics != null)
@@ -7971,7 +8010,7 @@
 	 */
 	public boolean validateProtocolStateMachine_validateProtocolTransitions(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return protocolStateMachine.validateProtocolTransitions(diagnostics,
 			context);
 	}
@@ -7984,7 +8023,7 @@
 	 */
 	public boolean validateProtocolStateMachine_validateEntryExitDo(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return protocolStateMachine.validateEntryExitDo(diagnostics, context);
 	}
 
@@ -7996,7 +8035,7 @@
 	 */
 	public boolean validateProtocolStateMachine_validateDeepOrShallowHistory(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return protocolStateMachine.validateDeepOrShallowHistory(diagnostics,
 			context);
 	}
@@ -8009,7 +8048,7 @@
 	 */
 	public boolean validateProtocolStateMachine_validatePortsConnected(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return protocolStateMachine
 			.validatePortsConnected(diagnostics, context);
 	}
@@ -8022,7 +8061,7 @@
 	 */
 	public boolean validateProtocolStateMachine_validateClassifierContext(
 			ProtocolStateMachine protocolStateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -8052,7 +8091,7 @@
 	 * @generated
 	 */
 	public boolean validateStateMachine(StateMachine stateMachine,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(stateMachine,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8143,7 +8182,8 @@
 	 * @generated
 	 */
 	public boolean validateStateMachine_validateClassifierContext(
-			StateMachine stateMachine, DiagnosticChain diagnostics, Map context) {
+			StateMachine stateMachine, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return stateMachine.validateClassifierContext(diagnostics, context);
 	}
 
@@ -8154,7 +8194,8 @@
 	 * @generated
 	 */
 	public boolean validateStateMachine_validateContextClassifier(
-			StateMachine stateMachine, DiagnosticChain diagnostics, Map context) {
+			StateMachine stateMachine, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return stateMachine.validateContextClassifier(diagnostics, context);
 	}
 
@@ -8165,7 +8206,8 @@
 	 * @generated
 	 */
 	public boolean validateStateMachine_validateConnectionPoints(
-			StateMachine stateMachine, DiagnosticChain diagnostics, Map context) {
+			StateMachine stateMachine, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return stateMachine.validateConnectionPoints(diagnostics, context);
 	}
 
@@ -8176,7 +8218,8 @@
 	 * @generated
 	 */
 	public boolean validateStateMachine_validateMethod(
-			StateMachine stateMachine, DiagnosticChain diagnostics, Map context) {
+			StateMachine stateMachine, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return stateMachine.validateMethod(diagnostics, context);
 	}
 
@@ -8186,7 +8229,7 @@
 	 * @generated
 	 */
 	public boolean validateRegion(Region region, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(region,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8242,7 +8285,7 @@
 	 * @generated
 	 */
 	public boolean validateRegion_validateInitialVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return region.validateInitialVertex(diagnostics, context);
 	}
 
@@ -8253,7 +8296,7 @@
 	 * @generated
 	 */
 	public boolean validateRegion_validateDeepHistoryVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return region.validateDeepHistoryVertex(diagnostics, context);
 	}
 
@@ -8264,7 +8307,7 @@
 	 * @generated
 	 */
 	public boolean validateRegion_validateShallowHistoryVertex(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return region.validateShallowHistoryVertex(diagnostics, context);
 	}
 
@@ -8275,7 +8318,7 @@
 	 * @generated
 	 */
 	public boolean validateRegion_validateOwned(Region region,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return region.validateOwned(diagnostics, context);
 	}
 
@@ -8285,7 +8328,7 @@
 	 * @generated
 	 */
 	public boolean validateVertex(Vertex vertex, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(vertex,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8320,7 +8363,7 @@
 	 * @generated
 	 */
 	public boolean validateTransition(Transition transition,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(transition,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8387,7 +8430,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateForkSegmentGuards(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateForkSegmentGuards(diagnostics, context);
 	}
 
@@ -8398,7 +8442,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateJoinSegmentGuards(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateJoinSegmentGuards(diagnostics, context);
 	}
 
@@ -8409,7 +8454,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateForkSegmentState(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateForkSegmentState(diagnostics, context);
 	}
 
@@ -8420,7 +8466,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateJoinSegmentState(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateJoinSegmentState(diagnostics, context);
 	}
 
@@ -8431,7 +8478,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateOutgoingPseudostates(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateOutgoingPseudostates(diagnostics, context);
 	}
 
@@ -8442,7 +8490,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateInitialTransition(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateInitialTransition(diagnostics, context);
 	}
 
@@ -8453,7 +8502,8 @@
 	 * @generated
 	 */
 	public boolean validateTransition_validateSignaturesCompatible(
-			Transition transition, DiagnosticChain diagnostics, Map context) {
+			Transition transition, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return transition.validateSignaturesCompatible(diagnostics, context);
 	}
 
@@ -8463,7 +8513,7 @@
 	 * @generated
 	 */
 	public boolean validateTrigger(Trigger trigger,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(trigger,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8498,7 +8548,7 @@
 	 * @generated
 	 */
 	public boolean validateEvent(Event event, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(event, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -8533,7 +8583,7 @@
 	 * @generated
 	 */
 	public boolean validatePort(Port port, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(port, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -8632,7 +8682,7 @@
 	 * @generated
 	 */
 	public boolean validatePort_validateRequiredInterfaces(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return port.validateRequiredInterfaces(diagnostics, context);
 	}
 
@@ -8643,7 +8693,7 @@
 	 * @generated
 	 */
 	public boolean validatePort_validatePortAggregation(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return port.validatePortAggregation(diagnostics, context);
 	}
 
@@ -8654,7 +8704,7 @@
 	 * @generated
 	 */
 	public boolean validatePort_validatePortDestroyed(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return port.validatePortDestroyed(diagnostics, context);
 	}
 
@@ -8665,7 +8715,7 @@
 	 * @generated
 	 */
 	public boolean validatePort_validateDefaultValue(Port port,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return port.validateDefaultValue(diagnostics, context);
 	}
 
@@ -8675,7 +8725,7 @@
 	 * @generated
 	 */
 	public boolean validateState(State state, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(state, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -8735,7 +8785,7 @@
 	 * @generated
 	 */
 	public boolean validateState_validateSubmachineStates(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return state.validateSubmachineStates(diagnostics, context);
 	}
 
@@ -8746,7 +8796,8 @@
 	 * @generated
 	 */
 	public boolean validateState_validateDestinationsOrSourcesOfTransitions(
-			State state, DiagnosticChain diagnostics, Map context) {
+			State state, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return state.validateDestinationsOrSourcesOfTransitions(diagnostics,
 			context);
 	}
@@ -8758,7 +8809,7 @@
 	 * @generated
 	 */
 	public boolean validateState_validateSubmachineOrRegions(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return state.validateSubmachineOrRegions(diagnostics, context);
 	}
 
@@ -8769,7 +8820,7 @@
 	 * @generated
 	 */
 	public boolean validateState_validateCompositeStates(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return state.validateCompositeStates(diagnostics, context);
 	}
 
@@ -8780,7 +8831,7 @@
 	 * @generated
 	 */
 	public boolean validateState_validateEntryOrExit(State state,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return state.validateEntryOrExit(diagnostics, context);
 	}
 
@@ -8791,7 +8842,7 @@
 	 */
 	public boolean validateConnectionPointReference(
 			ConnectionPointReference connectionPointReference,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			connectionPointReference, diagnostics, context);
 		if (result || diagnostics != null)
@@ -8835,7 +8886,7 @@
 	 */
 	public boolean validateConnectionPointReference_validateEntryPseudostates(
 			ConnectionPointReference connectionPointReference,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return connectionPointReference.validateEntryPseudostates(diagnostics,
 			context);
 	}
@@ -8848,7 +8899,7 @@
 	 */
 	public boolean validateConnectionPointReference_validateExitPseudostates(
 			ConnectionPointReference connectionPointReference,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return connectionPointReference.validateExitPseudostates(diagnostics,
 			context);
 	}
@@ -8859,7 +8910,7 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate(Pseudostate pseudostate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(pseudostate,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -8923,7 +8974,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateInitialVertex(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateInitialVertex(diagnostics, context);
 	}
 
@@ -8934,7 +8986,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateHistoryVertices(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateHistoryVertices(diagnostics, context);
 	}
 
@@ -8945,7 +8998,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateJoinVertex(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateJoinVertex(diagnostics, context);
 	}
 
@@ -8956,7 +9010,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateTransitionsIncoming(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateTransitionsIncoming(diagnostics, context);
 	}
 
@@ -8967,7 +9022,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateForkVertex(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateForkVertex(diagnostics, context);
 	}
 
@@ -8978,7 +9034,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateTransitionsOutgoing(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateTransitionsOutgoing(diagnostics, context);
 	}
 
@@ -8989,7 +9046,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateJunctionVertex(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateJunctionVertex(diagnostics, context);
 	}
 
@@ -9000,7 +9058,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateChoiceVertex(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateChoiceVertex(diagnostics, context);
 	}
 
@@ -9011,7 +9070,8 @@
 	 * @generated
 	 */
 	public boolean validatePseudostate_validateOutgoingFromInitial(
-			Pseudostate pseudostate, DiagnosticChain diagnostics, Map context) {
+			Pseudostate pseudostate, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return pseudostate.validateOutgoingFromInitial(diagnostics, context);
 	}
 
@@ -9022,7 +9082,7 @@
 	 */
 	public boolean validateProtocolConformance(
 			ProtocolConformance protocolConformance,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			protocolConformance, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9050,7 +9110,7 @@
 	 */
 	public boolean validateOperationTemplateParameter(
 			OperationTemplateParameter operationTemplateParameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			operationTemplateParameter, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9081,7 +9141,7 @@
 	 */
 	public boolean validateStructuralFeature(
 			StructuralFeature structuralFeature, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(structuralFeature,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9138,7 +9198,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociation(Association association,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(association,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9208,7 +9268,8 @@
 	 * @generated
 	 */
 	public boolean validateAssociation_validateSpecializedEndNumber(
-			Association association, DiagnosticChain diagnostics, Map context) {
+			Association association, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return association.validateSpecializedEndNumber(diagnostics, context);
 	}
 
@@ -9219,7 +9280,8 @@
 	 * @generated
 	 */
 	public boolean validateAssociation_validateSpecializedEndTypes(
-			Association association, DiagnosticChain diagnostics, Map context) {
+			Association association, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return association.validateSpecializedEndTypes(diagnostics, context);
 	}
 
@@ -9230,7 +9292,8 @@
 	 * @generated
 	 */
 	public boolean validateAssociation_validateBinaryAssociations(
-			Association association, DiagnosticChain diagnostics, Map context) {
+			Association association, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return association.validateBinaryAssociations(diagnostics, context);
 	}
 
@@ -9241,7 +9304,8 @@
 	 * @generated
 	 */
 	public boolean validateAssociation_validateAssociationEnds(
-			Association association, DiagnosticChain diagnostics, Map context) {
+			Association association, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return association.validateAssociationEnds(diagnostics, context);
 	}
 
@@ -9252,7 +9316,7 @@
 	 */
 	public boolean validateConnectableElementTemplateParameter(
 			ConnectableElementTemplateParameter connectableElementTemplateParameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			connectableElementTemplateParameter, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9282,7 +9346,7 @@
 	 * @generated
 	 */
 	public boolean validateCollaborationUse(CollaborationUse collaborationUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(collaborationUse,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9329,7 +9393,7 @@
 	 */
 	public boolean validateCollaborationUse_validateClientElements(
 			CollaborationUse collaborationUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return collaborationUse.validateClientElements(diagnostics, context);
 	}
 
@@ -9341,7 +9405,7 @@
 	 */
 	public boolean validateCollaborationUse_validateEveryRole(
 			CollaborationUse collaborationUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return collaborationUse.validateEveryRole(diagnostics, context);
 	}
 
@@ -9353,7 +9417,7 @@
 	 */
 	public boolean validateCollaborationUse_validateConnectors(
 			CollaborationUse collaborationUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return collaborationUse.validateConnectors(diagnostics, context);
 	}
 
@@ -9363,7 +9427,7 @@
 	 * @generated
 	 */
 	public boolean validateCollaboration(Collaboration collaboration,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(collaboration,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9427,7 +9491,7 @@
 	 */
 	public boolean validateStructuredClassifier(
 			StructuredClassifier structuredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			structuredClassifier, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9489,7 +9553,7 @@
 	 */
 	public boolean validateStructuredClassifier_validateMultiplicities(
 			StructuredClassifier structuredClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuredClassifier
 			.validateMultiplicities(diagnostics, context);
 	}
@@ -9500,7 +9564,7 @@
 	 * @generated
 	 */
 	public boolean validateConnector(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(connector,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9567,7 +9631,7 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateTypes(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return connector.validateTypes(diagnostics, context);
 	}
 
@@ -9578,7 +9642,7 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateCompatible(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return connector.validateCompatible(diagnostics, context);
 	}
 
@@ -9589,7 +9653,7 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateRoles(Connector connector,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return connector.validateRoles(diagnostics, context);
 	}
 
@@ -9600,7 +9664,8 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateBetweenInterfacesPorts(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connector.validateBetweenInterfacesPorts(diagnostics, context);
 	}
 
@@ -9611,7 +9676,8 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateBetweenInterfacePortImplements(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connector.validateBetweenInterfacePortImplements(diagnostics,
 			context);
 	}
@@ -9623,7 +9689,8 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateBetweenInterfacePortSignature(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connector.validateBetweenInterfacePortSignature(diagnostics,
 			context);
 	}
@@ -9635,7 +9702,8 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateUnionSignatureCompatible(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connector.validateUnionSignatureCompatible(diagnostics, context);
 	}
 
@@ -9646,7 +9714,8 @@
 	 * @generated
 	 */
 	public boolean validateConnector_validateAssemblyConnector(
-			Connector connector, DiagnosticChain diagnostics, Map context) {
+			Connector connector, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return connector.validateAssemblyConnector(diagnostics, context);
 	}
 
@@ -9657,7 +9726,7 @@
 	 */
 	public boolean validateRedefinableTemplateSignature(
 			RedefinableTemplateSignature redefinableTemplateSignature,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			redefinableTemplateSignature, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9707,7 +9776,7 @@
 	 */
 	public boolean validateRedefinableTemplateSignature_validateInheritedParameters(
 			RedefinableTemplateSignature redefinableTemplateSignature,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return redefinableTemplateSignature.validateInheritedParameters(
 			diagnostics, context);
 	}
@@ -9719,7 +9788,7 @@
 	 */
 	public boolean validateClassifierTemplateParameter(
 			ClassifierTemplateParameter classifierTemplateParameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			classifierTemplateParameter, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9754,7 +9823,7 @@
 	 */
 	public boolean validateClassifierTemplateParameter_validateHasConstrainingClassifier(
 			ClassifierTemplateParameter classifierTemplateParameter,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return classifierTemplateParameter.validateHasConstrainingClassifier(
 			diagnostics, context);
 	}
@@ -9766,7 +9835,7 @@
 	 */
 	public boolean validateInterfaceRealization(
 			InterfaceRealization interfaceRealization,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			interfaceRealization, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9803,7 +9872,7 @@
 	 */
 	public boolean validateEncapsulatedClassifier(
 			EncapsulatedClassifier encapsulatedClassifier,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			encapsulatedClassifier, diagnostics, context);
 		if (result || diagnostics != null)
@@ -9863,7 +9932,7 @@
 	 * @generated
 	 */
 	public boolean validateExtension(Extension extension,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(extension,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -9939,7 +10008,7 @@
 	 * @generated
 	 */
 	public boolean validateExtension_validateNonOwnedEnd(Extension extension,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return extension.validateNonOwnedEnd(diagnostics, context);
 	}
 
@@ -9950,7 +10019,7 @@
 	 * @generated
 	 */
 	public boolean validateExtension_validateIsBinary(Extension extension,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return extension.validateIsBinary(diagnostics, context);
 	}
 
@@ -9960,7 +10029,7 @@
 	 * @generated
 	 */
 	public boolean validateExtensionEnd(ExtensionEnd extensionEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(extensionEnd,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10054,7 +10123,8 @@
 	 * @generated
 	 */
 	public boolean validateExtensionEnd_validateMultiplicity(
-			ExtensionEnd extensionEnd, DiagnosticChain diagnostics, Map context) {
+			ExtensionEnd extensionEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return extensionEnd.validateMultiplicity(diagnostics, context);
 	}
 
@@ -10065,7 +10135,8 @@
 	 * @generated
 	 */
 	public boolean validateExtensionEnd_validateAggregation(
-			ExtensionEnd extensionEnd, DiagnosticChain diagnostics, Map context) {
+			ExtensionEnd extensionEnd, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return extensionEnd.validateAggregation(diagnostics, context);
 	}
 
@@ -10075,7 +10146,7 @@
 	 * @generated
 	 */
 	public boolean validateImage(Image image, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(image, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -10101,7 +10172,7 @@
 	 * @generated
 	 */
 	public boolean validateStringExpression(StringExpression stringExpression,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(stringExpression,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10145,7 +10216,7 @@
 	 */
 	public boolean validateStringExpression_validateOperands(
 			StringExpression stringExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return stringExpression.validateOperands(diagnostics, context);
 	}
 
@@ -10157,7 +10228,7 @@
 	 */
 	public boolean validateStringExpression_validateSubexpressions(
 			StringExpression stringExpression, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return stringExpression.validateSubexpressions(diagnostics, context);
 	}
 
@@ -10167,7 +10238,7 @@
 	 * @generated
 	 */
 	public boolean validateExpression(Expression expression,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(expression,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10203,7 +10274,7 @@
 	 * @generated
 	 */
 	public boolean validateLiteralInteger(LiteralInteger literalInteger,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(literalInteger,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10239,7 +10310,7 @@
 	 * @generated
 	 */
 	public boolean validateLiteralString(LiteralString literalString,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(literalString,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10275,7 +10346,7 @@
 	 * @generated
 	 */
 	public boolean validateLiteralBoolean(LiteralBoolean literalBoolean,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(literalBoolean,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10311,7 +10382,7 @@
 	 * @generated
 	 */
 	public boolean validateLiteralNull(LiteralNull literalNull,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(literalNull,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10347,7 +10418,7 @@
 	 * @generated
 	 */
 	public boolean validateSlot(Slot slot, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(slot, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -10374,7 +10445,7 @@
 	 */
 	public boolean validateInstanceSpecification(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			instanceSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -10424,7 +10495,7 @@
 	 */
 	public boolean validateInstanceSpecification_validateDefiningFeature(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return instanceSpecification.validateDefiningFeature(diagnostics,
 			context);
 	}
@@ -10437,7 +10508,7 @@
 	 */
 	public boolean validateInstanceSpecification_validateStructuralFeature(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return instanceSpecification.validateStructuralFeature(diagnostics,
 			context);
 	}
@@ -10450,7 +10521,7 @@
 	 */
 	public boolean validateInstanceSpecification_validateDeploymentTarget(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return instanceSpecification.validateDeploymentTarget(diagnostics,
 			context);
 	}
@@ -10463,7 +10534,7 @@
 	 */
 	public boolean validateInstanceSpecification_validateDeploymentArtifact(
 			InstanceSpecification instanceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return instanceSpecification.validateDeploymentArtifact(diagnostics,
 			context);
 	}
@@ -10474,7 +10545,7 @@
 	 * @generated
 	 */
 	public boolean validateEnumeration(Enumeration enumeration,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(enumeration,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10532,7 +10603,7 @@
 	 */
 	public boolean validateEnumerationLiteral(
 			EnumerationLiteral enumerationLiteral, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(enumerationLiteral,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10580,7 +10651,7 @@
 	 * @generated
 	 */
 	public boolean validatePrimitiveType(PrimitiveType primitiveType,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(primitiveType,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10637,7 +10708,7 @@
 	 * @generated
 	 */
 	public boolean validateInstanceValue(InstanceValue instanceValue,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(instanceValue,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10674,7 +10745,7 @@
 	 */
 	public boolean validateLiteralUnlimitedNatural(
 			LiteralUnlimitedNatural literalUnlimitedNatural,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			literalUnlimitedNatural, diagnostics, context);
 		if (result || diagnostics != null)
@@ -10710,7 +10781,7 @@
 	 * @generated
 	 */
 	public boolean validateOpaqueBehavior(OpaqueBehavior opaqueBehavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(opaqueBehavior,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10788,7 +10859,7 @@
 	 * @generated
 	 */
 	public boolean validateFunctionBehavior(FunctionBehavior functionBehavior,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(functionBehavior,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -10874,7 +10945,7 @@
 	 */
 	public boolean validateFunctionBehavior_validateOneOutputParameter(
 			FunctionBehavior functionBehavior, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return functionBehavior
 			.validateOneOutputParameter(diagnostics, context);
 	}
@@ -10887,7 +10958,7 @@
 	 */
 	public boolean validateFunctionBehavior_validateTypesOfParameters(
 			FunctionBehavior functionBehavior, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return functionBehavior.validateTypesOfParameters(diagnostics, context);
 	}
 
@@ -10897,7 +10968,7 @@
 	 * @generated
 	 */
 	public boolean validateActor(Actor actor, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(actor, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -10963,7 +11034,7 @@
 	 * @generated
 	 */
 	public boolean validateActor_validateAssociations(Actor actor,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return actor.validateAssociations(diagnostics, context);
 	}
 
@@ -10974,7 +11045,7 @@
 	 * @generated
 	 */
 	public boolean validateActor_validateMustHaveName(Actor actor,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return actor.validateMustHaveName(diagnostics, context);
 	}
 
@@ -10984,7 +11055,7 @@
 	 * @generated
 	 */
 	public boolean validateUsage(Usage usage, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(usage, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -11019,7 +11090,7 @@
 	 * @generated
 	 */
 	public boolean validateMessage(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(message,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11076,7 +11147,8 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateSendingReceivingMessageEvent(
-			Message message, DiagnosticChain diagnostics, Map context) {
+			Message message, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return message.validateSendingReceivingMessageEvent(diagnostics,
 			context);
 	}
@@ -11088,7 +11160,7 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateSignatureReferTo(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return message.validateSignatureReferTo(diagnostics, context);
 	}
 
@@ -11099,7 +11171,8 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateSignatureIsOperation(
-			Message message, DiagnosticChain diagnostics, Map context) {
+			Message message, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return message.validateSignatureIsOperation(diagnostics, context);
 	}
 
@@ -11110,7 +11183,7 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateSignatureIsSignal(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return message.validateSignatureIsSignal(diagnostics, context);
 	}
 
@@ -11121,7 +11194,7 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateArguments(Message message,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return message.validateArguments(diagnostics, context);
 	}
 
@@ -11132,7 +11205,8 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateCannotCrossBoundaries(
-			Message message, DiagnosticChain diagnostics, Map context) {
+			Message message, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return message.validateCannotCrossBoundaries(diagnostics, context);
 	}
 
@@ -11143,7 +11217,8 @@
 	 * @generated
 	 */
 	public boolean validateMessage_validateOccurrenceSpecifications(
-			Message message, DiagnosticChain diagnostics, Map context) {
+			Message message, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return message.validateOccurrenceSpecifications(diagnostics, context);
 	}
 
@@ -11153,7 +11228,7 @@
 	 * @generated
 	 */
 	public boolean validateMessageEnd(MessageEnd messageEnd,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(messageEnd,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11189,7 +11264,7 @@
 	 * @generated
 	 */
 	public boolean validateInteraction(Interaction interaction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(interaction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11268,7 +11343,7 @@
 	 */
 	public boolean validateInteractionFragment(
 			InteractionFragment interactionFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			interactionFragment, diagnostics, context);
 		if (result || diagnostics != null)
@@ -11304,7 +11379,7 @@
 	 * @generated
 	 */
 	public boolean validateLifeline(Lifeline lifeline,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(lifeline,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11350,7 +11425,8 @@
 	 * @generated
 	 */
 	public boolean validateLifeline_validateInteractionUsesShareLifeline(
-			Lifeline lifeline, DiagnosticChain diagnostics, Map context) {
+			Lifeline lifeline, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return lifeline.validateInteractionUsesShareLifeline(diagnostics,
 			context);
 	}
@@ -11362,7 +11438,8 @@
 	 * @generated
 	 */
 	public boolean validateLifeline_validateSelectorSpecified(
-			Lifeline lifeline, DiagnosticChain diagnostics, Map context) {
+			Lifeline lifeline, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return lifeline.validateSelectorSpecified(diagnostics, context);
 	}
 
@@ -11373,7 +11450,7 @@
 	 * @generated
 	 */
 	public boolean validateLifeline_validateSameClassifier(Lifeline lifeline,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return lifeline.validateSameClassifier(diagnostics, context);
 	}
 
@@ -11384,7 +11461,7 @@
 	 */
 	public boolean validatePartDecomposition(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(partDecomposition,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11443,7 +11520,7 @@
 	 */
 	public boolean validatePartDecomposition_validatePartsOfInternalStructures(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return partDecomposition.validatePartsOfInternalStructures(diagnostics,
 			context);
 	}
@@ -11456,7 +11533,7 @@
 	 */
 	public boolean validatePartDecomposition_validateAssume(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return partDecomposition.validateAssume(diagnostics, context);
 	}
 
@@ -11468,7 +11545,7 @@
 	 */
 	public boolean validatePartDecomposition_validateCommutativityOfDecomposition(
 			PartDecomposition partDecomposition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return partDecomposition.validateCommutativityOfDecomposition(
 			diagnostics, context);
 	}
@@ -11479,7 +11556,7 @@
 	 * @generated
 	 */
 	public boolean validateInteractionUse(InteractionUse interactionUse,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(interactionUse,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11529,7 +11606,7 @@
 	 */
 	public boolean validateInteractionUse_validateGatesMatch(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionUse.validateGatesMatch(diagnostics, context);
 	}
 
@@ -11541,7 +11618,7 @@
 	 */
 	public boolean validateInteractionUse_validateAllLifelines(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionUse.validateAllLifelines(diagnostics, context);
 	}
 
@@ -11553,7 +11630,7 @@
 	 */
 	public boolean validateInteractionUse_validateArgumentsCorrespondToParameters(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionUse.validateArgumentsCorrespondToParameters(
 			diagnostics, context);
 	}
@@ -11566,7 +11643,7 @@
 	 */
 	public boolean validateInteractionUse_validateArgumentsAreConstants(
 			InteractionUse interactionUse, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionUse.validateArgumentsAreConstants(diagnostics,
 			context);
 	}
@@ -11577,7 +11654,7 @@
 	 * @generated
 	 */
 	public boolean validateGate(Gate gate, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(gate, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -11619,7 +11696,7 @@
 	 * @generated
 	 */
 	public boolean validateGate_validateMessagesActualGate(Gate gate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return gate.validateMessagesActualGate(diagnostics, context);
 	}
 
@@ -11630,7 +11707,7 @@
 	 * @generated
 	 */
 	public boolean validateGate_validateMessagesCombinedFragment(Gate gate,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return gate.validateMessagesCombinedFragment(diagnostics, context);
 	}
 
@@ -11640,7 +11717,7 @@
 	 * @generated
 	 */
 	public boolean validateAction(Action action, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(action,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11687,7 +11764,7 @@
 	 * @generated
 	 */
 	public boolean validateExecutableNode(ExecutableNode executableNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(executableNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11735,7 +11812,7 @@
 	 * @generated
 	 */
 	public boolean validateActivityNode(ActivityNode activityNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activityNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11784,7 +11861,8 @@
 	 * @generated
 	 */
 	public boolean validateActivityNode_validateOwned(
-			ActivityNode activityNode, DiagnosticChain diagnostics, Map context) {
+			ActivityNode activityNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activityNode.validateOwned(diagnostics, context);
 	}
 
@@ -11795,7 +11873,8 @@
 	 * @generated
 	 */
 	public boolean validateActivityNode_validateOwnedStructuredNode(
-			ActivityNode activityNode, DiagnosticChain diagnostics, Map context) {
+			ActivityNode activityNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activityNode.validateOwnedStructuredNode(diagnostics, context);
 	}
 
@@ -11805,7 +11884,7 @@
 	 * @generated
 	 */
 	public boolean validateActivityEdge(ActivityEdge activityEdge,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activityEdge,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11857,7 +11936,8 @@
 	 * @generated
 	 */
 	public boolean validateActivityEdge_validateSourceAndTarget(
-			ActivityEdge activityEdge, DiagnosticChain diagnostics, Map context) {
+			ActivityEdge activityEdge, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activityEdge.validateSourceAndTarget(diagnostics, context);
 	}
 
@@ -11868,7 +11948,8 @@
 	 * @generated
 	 */
 	public boolean validateActivityEdge_validateOwned(
-			ActivityEdge activityEdge, DiagnosticChain diagnostics, Map context) {
+			ActivityEdge activityEdge, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activityEdge.validateOwned(diagnostics, context);
 	}
 
@@ -11879,7 +11960,8 @@
 	 * @generated
 	 */
 	public boolean validateActivityEdge_validateStructuredNode(
-			ActivityEdge activityEdge, DiagnosticChain diagnostics, Map context) {
+			ActivityEdge activityEdge, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activityEdge.validateStructuredNode(diagnostics, context);
 	}
 
@@ -11889,7 +11971,7 @@
 	 * @generated
 	 */
 	public boolean validateActivity(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activity,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -11977,7 +12059,7 @@
 	 * @generated
 	 */
 	public boolean validateActivity_validateNoSupergroups(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activity.validateNoSupergroups(diagnostics, context);
 	}
 
@@ -11988,7 +12070,8 @@
 	 * @generated
 	 */
 	public boolean validateActivity_validateActivityParameterNode(
-			Activity activity, DiagnosticChain diagnostics, Map context) {
+			Activity activity, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return activity.validateActivityParameterNode(diagnostics, context);
 	}
 
@@ -11999,7 +12082,7 @@
 	 * @generated
 	 */
 	public boolean validateActivity_validateAutonomous(Activity activity,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activity.validateAutonomous(diagnostics, context);
 	}
 
@@ -12010,7 +12093,7 @@
 	 */
 	public boolean validateActivityPartition(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activityPartition,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12069,7 +12152,7 @@
 	 */
 	public boolean validateActivityPartition_validateDimensionNotContained(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityPartition.validateDimensionNotContained(diagnostics,
 			context);
 	}
@@ -12082,7 +12165,7 @@
 	 */
 	public boolean validateActivityPartition_validateRepresentsPart(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityPartition.validateRepresentsPart(diagnostics, context);
 	}
 
@@ -12094,7 +12177,7 @@
 	 */
 	public boolean validateActivityPartition_validateRepresentsClassifier(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityPartition.validateRepresentsClassifier(diagnostics,
 			context);
 	}
@@ -12107,7 +12190,7 @@
 	 */
 	public boolean validateActivityPartition_validateRepresentsPartAndIsContained(
 			ActivityPartition activityPartition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityPartition.validateRepresentsPartAndIsContained(
 			diagnostics, context);
 	}
@@ -12118,7 +12201,7 @@
 	 * @generated
 	 */
 	public boolean validateActivityGroup(ActivityGroup activityGroup,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activityGroup,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12156,7 +12239,7 @@
 	 */
 	public boolean validateActivityGroup_validateNodesAndEdges(
 			ActivityGroup activityGroup, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityGroup.validateNodesAndEdges(diagnostics, context);
 	}
 
@@ -12168,7 +12251,7 @@
 	 */
 	public boolean validateActivityGroup_validateNotContained(
 			ActivityGroup activityGroup, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityGroup.validateNotContained(diagnostics, context);
 	}
 
@@ -12180,7 +12263,7 @@
 	 */
 	public boolean validateActivityGroup_validateGroupOwned(
 			ActivityGroup activityGroup, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return activityGroup.validateGroupOwned(diagnostics, context);
 	}
 
@@ -12191,7 +12274,7 @@
 	 */
 	public boolean validateStructuredActivityNode(
 			StructuredActivityNode structuredActivityNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			structuredActivityNode, diagnostics, context);
 		if (result || diagnostics != null)
@@ -12256,7 +12339,7 @@
 	 */
 	public boolean validateStructuredActivityNode_validateEdges(
 			StructuredActivityNode structuredActivityNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuredActivityNode.validateEdges(diagnostics, context);
 	}
 
@@ -12266,7 +12349,7 @@
 	 * @generated
 	 */
 	public boolean validateVariable(Variable variable,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(variable,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12321,7 +12404,7 @@
 	 * @generated
 	 */
 	public boolean validateVariable_validateOwned(Variable variable,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return variable.validateOwned(diagnostics, context);
 	}
 
@@ -12332,7 +12415,7 @@
 	 */
 	public boolean validateInterruptibleActivityRegion(
 			InterruptibleActivityRegion interruptibleActivityRegion,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			interruptibleActivityRegion, diagnostics, context);
 		if (result || diagnostics != null)
@@ -12373,7 +12456,7 @@
 	 */
 	public boolean validateInterruptibleActivityRegion_validateInterruptingEdges(
 			InterruptibleActivityRegion interruptibleActivityRegion,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interruptibleActivityRegion.validateInterruptingEdges(
 			diagnostics, context);
 	}
@@ -12384,7 +12467,7 @@
 	 * @generated
 	 */
 	public boolean validateExceptionHandler(ExceptionHandler exceptionHandler,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(exceptionHandler,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12425,7 +12508,7 @@
 	 */
 	public boolean validateExceptionHandler_validateExceptionBody(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return exceptionHandler.validateExceptionBody(diagnostics, context);
 	}
 
@@ -12437,7 +12520,7 @@
 	 */
 	public boolean validateExceptionHandler_validateResultPins(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return exceptionHandler.validateResultPins(diagnostics, context);
 	}
 
@@ -12449,7 +12532,7 @@
 	 */
 	public boolean validateExceptionHandler_validateOneInput(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return exceptionHandler.validateOneInput(diagnostics, context);
 	}
 
@@ -12461,7 +12544,7 @@
 	 */
 	public boolean validateExceptionHandler_validateEdgeSourceTarget(
 			ExceptionHandler exceptionHandler, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return exceptionHandler.validateEdgeSourceTarget(diagnostics, context);
 	}
 
@@ -12471,7 +12554,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectNode(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(objectNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12532,7 +12615,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectNode_validateObjectFlowEdges(
-			ObjectNode objectNode, DiagnosticChain diagnostics, Map context) {
+			ObjectNode objectNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectNode.validateObjectFlowEdges(diagnostics, context);
 	}
 
@@ -12543,7 +12627,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectNode_validateNotUnique(ObjectNode objectNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return objectNode.validateNotUnique(diagnostics, context);
 	}
 
@@ -12554,7 +12638,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectNode_validateSelectionBehavior(
-			ObjectNode objectNode, DiagnosticChain diagnostics, Map context) {
+			ObjectNode objectNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectNode.validateSelectionBehavior(diagnostics, context);
 	}
 
@@ -12565,7 +12650,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectNode_validateInputOutputParameter(
-			ObjectNode objectNode, DiagnosticChain diagnostics, Map context) {
+			ObjectNode objectNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectNode.validateInputOutputParameter(diagnostics, context);
 	}
 
@@ -12575,7 +12661,7 @@
 	 * @generated
 	 */
 	public boolean validateOutputPin(OutputPin outputPin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(outputPin,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12657,7 +12743,8 @@
 	 * @generated
 	 */
 	public boolean validateOutputPin_validateIncomingEdgesStructuredOnly(
-			OutputPin outputPin, DiagnosticChain diagnostics, Map context) {
+			OutputPin outputPin, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return outputPin.validateIncomingEdgesStructuredOnly(diagnostics,
 			context);
 	}
@@ -12667,7 +12754,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean validatePin(Pin pin, DiagnosticChain diagnostics, Map context) {
+	public boolean validatePin(Pin pin, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(pin, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -12743,7 +12831,7 @@
 	 * @generated
 	 */
 	public boolean validatePin_validateControlPins(Pin pin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return pin.validateControlPins(diagnostics, context);
 	}
 
@@ -12753,7 +12841,7 @@
 	 * @generated
 	 */
 	public boolean validateInputPin(InputPin inputPin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(inputPin,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12835,7 +12923,8 @@
 	 * @generated
 	 */
 	public boolean validateInputPin_validateOutgoingEdgesStructuredOnly(
-			InputPin inputPin, DiagnosticChain diagnostics, Map context) {
+			InputPin inputPin, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return inputPin.validateOutgoingEdgesStructuredOnly(diagnostics,
 			context);
 	}
@@ -12846,7 +12935,7 @@
 	 * @generated
 	 */
 	public boolean validateGeneralOrdering(GeneralOrdering generalOrdering,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(generalOrdering,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12883,7 +12972,7 @@
 	 */
 	public boolean validateOccurrenceSpecification(
 			OccurrenceSpecification occurrenceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			occurrenceSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -12920,7 +13009,7 @@
 	 */
 	public boolean validateInteractionOperand(
 			InteractionOperand interactionOperand, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(interactionOperand,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -12967,7 +13056,7 @@
 	 */
 	public boolean validateInteractionOperand_validateGuardDirectlyPrior(
 			InteractionOperand interactionOperand, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionOperand.validateGuardDirectlyPrior(diagnostics,
 			context);
 	}
@@ -12980,7 +13069,7 @@
 	 */
 	public boolean validateInteractionOperand_validateGuardContainReferences(
 			InteractionOperand interactionOperand, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return interactionOperand.validateGuardContainReferences(diagnostics,
 			context);
 	}
@@ -12992,7 +13081,7 @@
 	 */
 	public boolean validateInteractionConstraint(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			interactionConstraint, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13063,7 +13152,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateDynamicVariables(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateDynamicVariables(diagnostics,
 			context);
 	}
@@ -13076,7 +13165,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateGlobalData(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateGlobalData(diagnostics, context);
 	}
 
@@ -13088,7 +13177,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateMinintMaxint(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateMinintMaxint(diagnostics, context);
 	}
 
@@ -13100,7 +13189,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateMinintNonNegative(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateMinintNonNegative(diagnostics,
 			context);
 	}
@@ -13113,7 +13202,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateMaxintPositive(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateMaxintPositive(diagnostics,
 			context);
 	}
@@ -13126,7 +13215,7 @@
 	 */
 	public boolean validateInteractionConstraint_validateMaxintGreaterEqualMinint(
 			InteractionConstraint interactionConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return interactionConstraint.validateMaxintGreaterEqualMinint(
 			diagnostics, context);
 	}
@@ -13138,7 +13227,7 @@
 	 */
 	public boolean validateExecutionSpecification(
 			ExecutionSpecification executionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			executionSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13179,7 +13268,7 @@
 	 */
 	public boolean validateExecutionSpecification_validateSameLifeline(
 			ExecutionSpecification executionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return executionSpecification
 			.validateSameLifeline(diagnostics, context);
 	}
@@ -13191,7 +13280,7 @@
 	 */
 	public boolean validateExecutionOccurrenceSpecification(
 			ExecutionOccurrenceSpecification executionOccurrenceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			executionOccurrenceSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13227,7 +13316,7 @@
 	 * @generated
 	 */
 	public boolean validateExecutionEvent(ExecutionEvent executionEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(executionEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13263,7 +13352,7 @@
 	 * @generated
 	 */
 	public boolean validateStateInvariant(StateInvariant stateInvariant,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(stateInvariant,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13300,7 +13389,7 @@
 	 */
 	public boolean validateActionExecutionSpecification(
 			ActionExecutionSpecification actionExecutionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			actionExecutionSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13344,7 +13433,7 @@
 	 */
 	public boolean validateActionExecutionSpecification_validateActionReferenced(
 			ActionExecutionSpecification actionExecutionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return actionExecutionSpecification.validateActionReferenced(
 			diagnostics, context);
 	}
@@ -13356,7 +13445,7 @@
 	 */
 	public boolean validateBehaviorExecutionSpecification(
 			BehaviorExecutionSpecification behaviorExecutionSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			behaviorExecutionSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13395,7 +13484,7 @@
 	 * @generated
 	 */
 	public boolean validateCreationEvent(CreationEvent creationEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(creationEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13436,7 +13525,7 @@
 	 */
 	public boolean validateCreationEvent_validateNoOccurrenceAbove(
 			CreationEvent creationEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return creationEvent.validateNoOccurrenceAbove(diagnostics, context);
 	}
 
@@ -13446,7 +13535,7 @@
 	 * @generated
 	 */
 	public boolean validateDestructionEvent(DestructionEvent destructionEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(destructionEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13487,7 +13576,7 @@
 	 */
 	public boolean validateDestructionEvent_validateNoOccurrenceSpecificationsBelow(
 			DestructionEvent destructionEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return destructionEvent.validateNoOccurrenceSpecificationsBelow(
 			diagnostics, context);
 	}
@@ -13499,7 +13588,7 @@
 	 */
 	public boolean validateSendOperationEvent(
 			SendOperationEvent sendOperationEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(sendOperationEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13535,7 +13624,7 @@
 	 * @generated
 	 */
 	public boolean validateMessageEvent(MessageEvent messageEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(messageEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13571,7 +13660,7 @@
 	 * @generated
 	 */
 	public boolean validateSendSignalEvent(SendSignalEvent sendSignalEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(sendSignalEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13608,7 +13697,7 @@
 	 */
 	public boolean validateMessageOccurrenceSpecification(
 			MessageOccurrenceSpecification messageOccurrenceSpecification,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			messageOccurrenceSpecification, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13645,7 +13734,7 @@
 	 */
 	public boolean validateReceiveOperationEvent(
 			ReceiveOperationEvent receiveOperationEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			receiveOperationEvent, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13682,7 +13771,7 @@
 	 */
 	public boolean validateReceiveSignalEvent(
 			ReceiveSignalEvent receiveSignalEvent, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(receiveSignalEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13718,7 +13807,7 @@
 	 * @generated
 	 */
 	public boolean validateCombinedFragment(CombinedFragment combinedFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(combinedFragment,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13768,7 +13857,7 @@
 	 */
 	public boolean validateCombinedFragment_validateOptLoopBreakNeg(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return combinedFragment.validateOptLoopBreakNeg(diagnostics, context);
 	}
 
@@ -13780,7 +13869,7 @@
 	 */
 	public boolean validateCombinedFragment_validateMinintAndMaxint(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return combinedFragment.validateMinintAndMaxint(diagnostics, context);
 	}
 
@@ -13792,7 +13881,7 @@
 	 */
 	public boolean validateCombinedFragment_validateBreak(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return combinedFragment.validateBreak(diagnostics, context);
 	}
 
@@ -13804,7 +13893,7 @@
 	 */
 	public boolean validateCombinedFragment_validateConsiderAndIgnore(
 			CombinedFragment combinedFragment, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return combinedFragment.validateConsiderAndIgnore(diagnostics, context);
 	}
 
@@ -13814,7 +13903,7 @@
 	 * @generated
 	 */
 	public boolean validateContinuation(Continuation continuation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(continuation,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -13860,7 +13949,8 @@
 	 * @generated
 	 */
 	public boolean validateContinuation_validateSameName(
-			Continuation continuation, DiagnosticChain diagnostics, Map context) {
+			Continuation continuation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return continuation.validateSameName(diagnostics, context);
 	}
 
@@ -13871,7 +13961,8 @@
 	 * @generated
 	 */
 	public boolean validateContinuation_validateGlobal(
-			Continuation continuation, DiagnosticChain diagnostics, Map context) {
+			Continuation continuation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return continuation.validateGlobal(diagnostics, context);
 	}
 
@@ -13882,7 +13973,8 @@
 	 * @generated
 	 */
 	public boolean validateContinuation_validateFirstOrLastInteractionFragment(
-			Continuation continuation, DiagnosticChain diagnostics, Map context) {
+			Continuation continuation, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return continuation.validateFirstOrLastInteractionFragment(diagnostics,
 			context);
 	}
@@ -13894,7 +13986,7 @@
 	 */
 	public boolean validateConsiderIgnoreFragment(
 			ConsiderIgnoreFragment considerIgnoreFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			considerIgnoreFragment, diagnostics, context);
 		if (result || diagnostics != null)
@@ -13950,7 +14042,7 @@
 	 */
 	public boolean validateConsiderIgnoreFragment_validateConsiderOrIgnore(
 			ConsiderIgnoreFragment considerIgnoreFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return considerIgnoreFragment.validateConsiderOrIgnore(diagnostics,
 			context);
 	}
@@ -13963,7 +14055,7 @@
 	 */
 	public boolean validateConsiderIgnoreFragment_validateType(
 			ConsiderIgnoreFragment considerIgnoreFragment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return considerIgnoreFragment.validateType(diagnostics, context);
 	}
 
@@ -13973,7 +14065,7 @@
 	 * @generated
 	 */
 	public boolean validateCallEvent(CallEvent callEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(callEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14009,7 +14101,7 @@
 	 * @generated
 	 */
 	public boolean validateChangeEvent(ChangeEvent changeEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(changeEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14045,7 +14137,7 @@
 	 * @generated
 	 */
 	public boolean validateSignalEvent(SignalEvent signalEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(signalEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14081,7 +14173,7 @@
 	 * @generated
 	 */
 	public boolean validateAnyReceiveEvent(AnyReceiveEvent anyReceiveEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(anyReceiveEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14118,7 +14210,7 @@
 	 */
 	public boolean validateCreateObjectAction(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(createObjectAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14180,7 +14272,7 @@
 	 */
 	public boolean validateCreateObjectAction_validateClassifierNotAbstract(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return createObjectAction.validateClassifierNotAbstract(diagnostics,
 			context);
 	}
@@ -14193,7 +14285,7 @@
 	 */
 	public boolean validateCreateObjectAction_validateClassifierNotAssociationClass(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return createObjectAction.validateClassifierNotAssociationClass(
 			diagnostics, context);
 	}
@@ -14206,7 +14298,7 @@
 	 */
 	public boolean validateCreateObjectAction_validateSameType(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return createObjectAction.validateSameType(diagnostics, context);
 	}
 
@@ -14218,7 +14310,7 @@
 	 */
 	public boolean validateCreateObjectAction_validateMultiplicity(
 			CreateObjectAction createObjectAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return createObjectAction.validateMultiplicity(diagnostics, context);
 	}
 
@@ -14229,7 +14321,7 @@
 	 */
 	public boolean validateDestroyObjectAction(
 			DestroyObjectAction destroyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			destroyObjectAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14285,7 +14377,7 @@
 	 */
 	public boolean validateDestroyObjectAction_validateMultiplicity(
 			DestroyObjectAction destroyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return destroyObjectAction.validateMultiplicity(diagnostics, context);
 	}
 
@@ -14297,7 +14389,7 @@
 	 */
 	public boolean validateDestroyObjectAction_validateNoType(
 			DestroyObjectAction destroyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return destroyObjectAction.validateNoType(diagnostics, context);
 	}
 
@@ -14308,7 +14400,7 @@
 	 */
 	public boolean validateTestIdentityAction(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(testIdentityAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14367,7 +14459,7 @@
 	 */
 	public boolean validateTestIdentityAction_validateNoType(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return testIdentityAction.validateNoType(diagnostics, context);
 	}
 
@@ -14379,7 +14471,7 @@
 	 */
 	public boolean validateTestIdentityAction_validateMultiplicity(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return testIdentityAction.validateMultiplicity(diagnostics, context);
 	}
 
@@ -14391,7 +14483,7 @@
 	 */
 	public boolean validateTestIdentityAction_validateResultIsBoolean(
 			TestIdentityAction testIdentityAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return testIdentityAction.validateResultIsBoolean(diagnostics, context);
 	}
 
@@ -14401,7 +14493,7 @@
 	 * @generated
 	 */
 	public boolean validateReadSelfAction(ReadSelfAction readSelfAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(readSelfAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -14463,7 +14555,7 @@
 	 */
 	public boolean validateReadSelfAction_validateContained(
 			ReadSelfAction readSelfAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readSelfAction.validateContained(diagnostics, context);
 	}
 
@@ -14475,7 +14567,7 @@
 	 */
 	public boolean validateReadSelfAction_validateNotStatic(
 			ReadSelfAction readSelfAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readSelfAction.validateNotStatic(diagnostics, context);
 	}
 
@@ -14487,7 +14579,7 @@
 	 */
 	public boolean validateReadSelfAction_validateType(
 			ReadSelfAction readSelfAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readSelfAction.validateType(diagnostics, context);
 	}
 
@@ -14499,7 +14591,7 @@
 	 */
 	public boolean validateReadSelfAction_validateMultiplicity(
 			ReadSelfAction readSelfAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readSelfAction.validateMultiplicity(diagnostics, context);
 	}
 
@@ -14510,7 +14602,7 @@
 	 */
 	public boolean validateStructuralFeatureAction(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			structuralFeatureAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14575,7 +14667,7 @@
 	 */
 	public boolean validateStructuralFeatureAction_validateNotStatic(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuralFeatureAction.validateNotStatic(diagnostics, context);
 	}
 
@@ -14587,7 +14679,7 @@
 	 */
 	public boolean validateStructuralFeatureAction_validateSameType(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuralFeatureAction.validateSameType(diagnostics, context);
 	}
 
@@ -14599,7 +14691,7 @@
 	 */
 	public boolean validateStructuralFeatureAction_validateMultiplicity(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuralFeatureAction.validateMultiplicity(diagnostics,
 			context);
 	}
@@ -14612,7 +14704,7 @@
 	 */
 	public boolean validateStructuralFeatureAction_validateVisibility(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuralFeatureAction.validateVisibility(diagnostics, context);
 	}
 
@@ -14624,7 +14716,7 @@
 	 */
 	public boolean validateStructuralFeatureAction_validateOneFeaturingClassifier(
 			StructuralFeatureAction structuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return structuralFeatureAction.validateOneFeaturingClassifier(
 			diagnostics, context);
 	}
@@ -14636,7 +14728,7 @@
 	 */
 	public boolean validateReadStructuralFeatureAction(
 			ReadStructuralFeatureAction readStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			readStructuralFeatureAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14704,7 +14796,7 @@
 	 */
 	public boolean validateReadStructuralFeatureAction_validateTypeAndOrdering(
 			ReadStructuralFeatureAction readStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readStructuralFeatureAction.validateTypeAndOrdering(diagnostics,
 			context);
 	}
@@ -14717,7 +14809,7 @@
 	 */
 	public boolean validateReadStructuralFeatureAction_validateMultiplicity(
 			ReadStructuralFeatureAction readStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -14748,7 +14840,7 @@
 	 */
 	public boolean validateWriteStructuralFeatureAction(
 			WriteStructuralFeatureAction writeStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			writeStructuralFeatureAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14816,7 +14908,7 @@
 	 */
 	public boolean validateWriteStructuralFeatureAction_validateInputPin(
 			WriteStructuralFeatureAction writeStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return writeStructuralFeatureAction.validateInputPin(diagnostics,
 			context);
 	}
@@ -14829,7 +14921,7 @@
 	 */
 	public boolean validateWriteStructuralFeatureAction_validateMultiplicity(
 			WriteStructuralFeatureAction writeStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -14860,7 +14952,7 @@
 	 */
 	public boolean validateClearStructuralFeatureAction(
 			ClearStructuralFeatureAction clearStructuralFeatureAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			clearStructuralFeatureAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14924,7 +15016,7 @@
 	 */
 	public boolean validateRemoveStructuralFeatureValueAction(
 			RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			removeStructuralFeatureValueAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -14995,7 +15087,7 @@
 	 */
 	public boolean validateRemoveStructuralFeatureValueAction_validateNonUniqueRemoval(
 			RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return removeStructuralFeatureValueAction.validateNonUniqueRemoval(
 			diagnostics, context);
 	}
@@ -15007,7 +15099,7 @@
 	 */
 	public boolean validateAddStructuralFeatureValueAction(
 			AddStructuralFeatureValueAction addStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			addStructuralFeatureValueAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -15078,7 +15170,7 @@
 	 */
 	public boolean validateAddStructuralFeatureValueAction_validateUnlimitedNaturalAndMultiplicity(
 			AddStructuralFeatureValueAction addStructuralFeatureValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return addStructuralFeatureValueAction
 			.validateUnlimitedNaturalAndMultiplicity(diagnostics, context);
 	}
@@ -15089,7 +15181,7 @@
 	 * @generated
 	 */
 	public boolean validateLinkAction(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(linkAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15147,7 +15239,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkAction_validateSameAssociation(
-			LinkAction linkAction, DiagnosticChain diagnostics, Map context) {
+			LinkAction linkAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkAction.validateSameAssociation(diagnostics, context);
 	}
 
@@ -15158,7 +15251,7 @@
 	 * @generated
 	 */
 	public boolean validateLinkAction_validateNotStatic(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkAction.validateNotStatic(diagnostics, context);
 	}
 
@@ -15169,7 +15262,7 @@
 	 * @generated
 	 */
 	public boolean validateLinkAction_validateSamePins(LinkAction linkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkAction.validateSamePins(diagnostics, context);
 	}
 
@@ -15179,7 +15272,7 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData(LinkEndData linkEndData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(linkEndData,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15222,7 +15315,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData_validatePropertyIsAssociationEnd(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkEndData.validatePropertyIsAssociationEnd(diagnostics,
 			context);
 	}
@@ -15234,7 +15328,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData_validateSameType(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkEndData.validateSameType(diagnostics, context);
 	}
 
@@ -15245,7 +15340,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData_validateMultiplicity(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkEndData.validateMultiplicity(diagnostics, context);
 	}
 
@@ -15256,7 +15352,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData_validateQualifiers(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkEndData.validateQualifiers(diagnostics, context);
 	}
 
@@ -15267,7 +15364,8 @@
 	 * @generated
 	 */
 	public boolean validateLinkEndData_validateEndObjectInputPin(
-			LinkEndData linkEndData, DiagnosticChain diagnostics, Map context) {
+			LinkEndData linkEndData, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return linkEndData.validateEndObjectInputPin(diagnostics, context);
 	}
 
@@ -15277,7 +15375,7 @@
 	 * @generated
 	 */
 	public boolean validateQualifierValue(QualifierValue qualifierValue,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(qualifierValue,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15315,7 +15413,7 @@
 	 */
 	public boolean validateQualifierValue_validateQualifierAttribute(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return qualifierValue.validateQualifierAttribute(diagnostics, context);
 	}
 
@@ -15327,7 +15425,7 @@
 	 */
 	public boolean validateQualifierValue_validateTypeOfQualifier(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return qualifierValue.validateTypeOfQualifier(diagnostics, context);
 	}
 
@@ -15339,7 +15437,7 @@
 	 */
 	public boolean validateQualifierValue_validateMultiplicityOfQualifier(
 			QualifierValue qualifierValue, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return qualifierValue.validateMultiplicityOfQualifier(diagnostics,
 			context);
 	}
@@ -15350,7 +15448,7 @@
 	 * @generated
 	 */
 	public boolean validateReadLinkAction(ReadLinkAction readLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(readLinkAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15424,7 +15522,7 @@
 	 */
 	public boolean validateReadLinkAction_validateOneOpenEnd(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readLinkAction.validateOneOpenEnd(diagnostics, context);
 	}
 
@@ -15436,7 +15534,7 @@
 	 */
 	public boolean validateReadLinkAction_validateTypeAndOrdering(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readLinkAction.validateTypeAndOrdering(diagnostics, context);
 	}
 
@@ -15448,7 +15546,7 @@
 	 */
 	public boolean validateReadLinkAction_validateCompatibleMultiplicity(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readLinkAction.validateCompatibleMultiplicity(diagnostics,
 			context);
 	}
@@ -15461,7 +15559,7 @@
 	 */
 	public boolean validateReadLinkAction_validateNavigableOpenEnd(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readLinkAction.validateNavigableOpenEnd(diagnostics, context);
 	}
 
@@ -15473,7 +15571,7 @@
 	 */
 	public boolean validateReadLinkAction_validateVisibility(
 			ReadLinkAction readLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readLinkAction.validateVisibility(diagnostics, context);
 	}
 
@@ -15484,7 +15582,7 @@
 	 */
 	public boolean validateLinkEndCreationData(
 			LinkEndCreationData linkEndCreationData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			linkEndCreationData, diagnostics, context);
 		if (result || diagnostics != null)
@@ -15534,7 +15632,7 @@
 	 */
 	public boolean validateLinkEndCreationData_validateCreateLinkAction(
 			LinkEndCreationData linkEndCreationData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkEndCreationData.validateCreateLinkAction(diagnostics,
 			context);
 	}
@@ -15547,7 +15645,7 @@
 	 */
 	public boolean validateLinkEndCreationData_validateSingleInputPin(
 			LinkEndCreationData linkEndCreationData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkEndCreationData.validateSingleInputPin(diagnostics, context);
 	}
 
@@ -15557,7 +15655,7 @@
 	 * @generated
 	 */
 	public boolean validateCreateLinkAction(CreateLinkAction createLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(createLinkAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15622,7 +15720,7 @@
 	 */
 	public boolean validateCreateLinkAction_validateAssociationNotAbstract(
 			CreateLinkAction createLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return createLinkAction.validateAssociationNotAbstract(diagnostics,
 			context);
 	}
@@ -15633,7 +15731,7 @@
 	 * @generated
 	 */
 	public boolean validateWriteLinkAction(WriteLinkAction writeLinkAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(writeLinkAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15695,7 +15793,7 @@
 	 */
 	public boolean validateWriteLinkAction_validateAllowAccess(
 			WriteLinkAction writeLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return writeLinkAction.validateAllowAccess(diagnostics, context);
 	}
 
@@ -15706,7 +15804,7 @@
 	 */
 	public boolean validateDestroyLinkAction(
 			DestroyLinkAction destroyLinkAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(destroyLinkAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -15767,7 +15865,7 @@
 	 */
 	public boolean validateLinkEndDestructionData(
 			LinkEndDestructionData linkEndDestructionData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			linkEndDestructionData, diagnostics, context);
 		if (result || diagnostics != null)
@@ -15817,7 +15915,7 @@
 	 */
 	public boolean validateLinkEndDestructionData_validateDestroyLinkAction(
 			LinkEndDestructionData linkEndDestructionData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkEndDestructionData.validateDestroyLinkAction(diagnostics,
 			context);
 	}
@@ -15830,7 +15928,7 @@
 	 */
 	public boolean validateLinkEndDestructionData_validateUnlimitedNaturalAndMultiplicity(
 			LinkEndDestructionData linkEndDestructionData,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return linkEndDestructionData.validateUnlimitedNaturalAndMultiplicity(
 			diagnostics, context);
 	}
@@ -15842,7 +15940,7 @@
 	 */
 	public boolean validateClearAssociationAction(
 			ClearAssociationAction clearAssociationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			clearAssociationAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -15898,7 +15996,7 @@
 	 */
 	public boolean validateClearAssociationAction_validateSameType(
 			ClearAssociationAction clearAssociationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return clearAssociationAction.validateSameType(diagnostics, context);
 	}
 
@@ -15910,7 +16008,7 @@
 	 */
 	public boolean validateClearAssociationAction_validateMultiplicity(
 			ClearAssociationAction clearAssociationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return clearAssociationAction
 			.validateMultiplicity(diagnostics, context);
 	}
@@ -15922,7 +16020,7 @@
 	 */
 	public boolean validateBroadcastSignalAction(
 			BroadcastSignalAction broadcastSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			broadcastSignalAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -15981,7 +16079,7 @@
 	 */
 	public boolean validateBroadcastSignalAction_validateNumberAndOrder(
 			BroadcastSignalAction broadcastSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return broadcastSignalAction.validateNumberAndOrder(diagnostics,
 			context);
 	}
@@ -15994,7 +16092,7 @@
 	 */
 	public boolean validateBroadcastSignalAction_validateTypeOrderingMultiplicity(
 			BroadcastSignalAction broadcastSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return broadcastSignalAction.validateTypeOrderingMultiplicity(
 			diagnostics, context);
 	}
@@ -16005,7 +16103,7 @@
 	 * @generated
 	 */
 	public boolean validateInvocationAction(InvocationAction invocationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(invocationAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16058,7 +16156,7 @@
 	 */
 	public boolean validateInvocationAction_validateOnPortReceiver(
 			InvocationAction invocationAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return invocationAction.validateOnPortReceiver(diagnostics, context);
 	}
 
@@ -16068,7 +16166,7 @@
 	 * @generated
 	 */
 	public boolean validateSendObjectAction(SendObjectAction sendObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(sendObjectAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16120,7 +16218,7 @@
 	 */
 	public boolean validateValueSpecificationAction(
 			ValueSpecificationAction valueSpecificationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			valueSpecificationAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -16176,7 +16274,7 @@
 	 */
 	public boolean validateValueSpecificationAction_validateCompatibleType(
 			ValueSpecificationAction valueSpecificationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return valueSpecificationAction.validateCompatibleType(diagnostics,
 			context);
 	}
@@ -16189,7 +16287,7 @@
 	 */
 	public boolean validateValueSpecificationAction_validateMultiplicity(
 			ValueSpecificationAction valueSpecificationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return valueSpecificationAction.validateMultiplicity(diagnostics,
 			context);
 	}
@@ -16200,7 +16298,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeExpression(TimeExpression timeExpression,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(timeExpression,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16236,7 +16334,7 @@
 	 * @generated
 	 */
 	public boolean validateObservation(Observation observation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(observation,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16272,7 +16370,7 @@
 	 * @generated
 	 */
 	public boolean validateDuration(Duration duration,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(duration,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16308,7 +16406,7 @@
 	 * @generated
 	 */
 	public boolean validateValuePin(ValuePin valuePin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(valuePin,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16396,7 +16494,7 @@
 	 * @generated
 	 */
 	public boolean validateValuePin_validateCompatibleType(ValuePin valuePin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return valuePin.validateCompatibleType(diagnostics, context);
 	}
 
@@ -16407,7 +16505,7 @@
 	 * @generated
 	 */
 	public boolean validateValuePin_validateNoIncomingEdges(ValuePin valuePin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return valuePin.validateNoIncomingEdges(diagnostics, context);
 	}
 
@@ -16417,7 +16515,7 @@
 	 * @generated
 	 */
 	public boolean validateDurationInterval(DurationInterval durationInterval,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(durationInterval,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16453,7 +16551,7 @@
 	 * @generated
 	 */
 	public boolean validateInterval(Interval interval,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(interval,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16489,7 +16587,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeConstraint(TimeConstraint timeConstraint,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(timeConstraint,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16541,7 +16639,7 @@
 	 */
 	public boolean validateIntervalConstraint(
 			IntervalConstraint intervalConstraint, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(intervalConstraint,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16592,7 +16690,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeInterval(TimeInterval timeInterval,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(timeInterval,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16629,7 +16727,7 @@
 	 */
 	public boolean validateDurationConstraint(
 			DurationConstraint durationConstraint, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(durationConstraint,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16685,7 +16783,7 @@
 	 */
 	public boolean validateDurationConstraint_validateFirstEventMultiplicity(
 			DurationConstraint durationConstraint, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return durationConstraint.validateFirstEventMultiplicity(diagnostics,
 			context);
 	}
@@ -16696,7 +16794,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeObservation(TimeObservation timeObservation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(timeObservation,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16733,7 +16831,7 @@
 	 */
 	public boolean validateDurationObservation(
 			DurationObservation durationObservation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			durationObservation, diagnostics, context);
 		if (result || diagnostics != null)
@@ -16774,7 +16872,7 @@
 	 */
 	public boolean validateDurationObservation_validateFirstEventMultiplicity(
 			DurationObservation durationObservation,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return durationObservation.validateFirstEventMultiplicity(diagnostics,
 			context);
 	}
@@ -16785,7 +16883,7 @@
 	 * @generated
 	 */
 	public boolean validateOpaqueAction(OpaqueAction opaqueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(opaqueAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16833,7 +16931,7 @@
 	 * @generated
 	 */
 	public boolean validateCallAction(CallAction callAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(callAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16894,7 +16992,8 @@
 	 * @generated
 	 */
 	public boolean validateCallAction_validateSynchronousCall(
-			CallAction callAction, DiagnosticChain diagnostics, Map context) {
+			CallAction callAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return callAction.validateSynchronousCall(diagnostics, context);
 	}
 
@@ -16905,7 +17004,8 @@
 	 * @generated
 	 */
 	public boolean validateCallAction_validateNumberAndOrder(
-			CallAction callAction, DiagnosticChain diagnostics, Map context) {
+			CallAction callAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return callAction.validateNumberAndOrder(diagnostics, context);
 	}
 
@@ -16916,7 +17016,8 @@
 	 * @generated
 	 */
 	public boolean validateCallAction_validateTypeOrderingMultiplicity(
-			CallAction callAction, DiagnosticChain diagnostics, Map context) {
+			CallAction callAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return callAction
 			.validateTypeOrderingMultiplicity(diagnostics, context);
 	}
@@ -16927,7 +17028,7 @@
 	 * @generated
 	 */
 	public boolean validateSendSignalAction(SendSignalAction sendSignalAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(sendSignalAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -16986,7 +17087,7 @@
 	 */
 	public boolean validateSendSignalAction_validateNumberOrder(
 			SendSignalAction sendSignalAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return sendSignalAction.validateNumberOrder(diagnostics, context);
 	}
 
@@ -16998,7 +17099,7 @@
 	 */
 	public boolean validateSendSignalAction_validateTypeOrderingMultiplicity(
 			SendSignalAction sendSignalAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return sendSignalAction.validateTypeOrderingMultiplicity(diagnostics,
 			context);
 	}
@@ -17010,7 +17111,7 @@
 	 */
 	public boolean validateCallOperationAction(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			callOperationAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17081,7 +17182,7 @@
 	 */
 	public boolean validateCallOperationAction_validateArgumentPinEqualParameter(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return callOperationAction.validateArgumentPinEqualParameter(
 			diagnostics, context);
 	}
@@ -17094,7 +17195,7 @@
 	 */
 	public boolean validateCallOperationAction_validateResultPinEqualParameter(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return callOperationAction.validateResultPinEqualParameter(diagnostics,
 			context);
 	}
@@ -17107,7 +17208,7 @@
 	 */
 	public boolean validateCallOperationAction_validateTypeTargetPin(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return callOperationAction.validateTypeTargetPin(diagnostics, context);
 	}
 
@@ -17119,7 +17220,7 @@
 	 */
 	public boolean validateCallOperationAction_validateTypeOrderingMultiplicity(
 			CallOperationAction callOperationAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -17150,7 +17251,7 @@
 	 */
 	public boolean validateCallBehaviorAction(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(callBehaviorAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -17218,7 +17319,7 @@
 	 */
 	public boolean validateCallBehaviorAction_validateArgumentPinEqualParameter(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return callBehaviorAction.validateArgumentPinEqualParameter(
 			diagnostics, context);
 	}
@@ -17231,7 +17332,7 @@
 	 */
 	public boolean validateCallBehaviorAction_validateResultPinEqualParameter(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return callBehaviorAction.validateResultPinEqualParameter(diagnostics,
 			context);
 	}
@@ -17244,7 +17345,7 @@
 	 */
 	public boolean validateCallBehaviorAction_validateTypeOrderingMultiplicity(
 			CallBehaviorAction callBehaviorAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -17274,7 +17375,7 @@
 	 * @generated
 	 */
 	public boolean validateInformationItem(InformationItem informationItem,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(informationItem,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -17342,7 +17443,7 @@
 	 */
 	public boolean validateInformationItem_validateSourcesAndTargets(
 			InformationItem informationItem, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationItem.validateSourcesAndTargets(diagnostics, context);
 	}
 
@@ -17354,7 +17455,7 @@
 	 */
 	public boolean validateInformationItem_validateHasNo(
 			InformationItem informationItem, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationItem.validateHasNo(diagnostics, context);
 	}
 
@@ -17366,7 +17467,7 @@
 	 */
 	public boolean validateInformationItem_validateNotInstantiable(
 			InformationItem informationItem, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationItem.validateNotInstantiable(diagnostics, context);
 	}
 
@@ -17376,7 +17477,7 @@
 	 * @generated
 	 */
 	public boolean validateInformationFlow(InformationFlow informationFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(informationFlow,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -17423,7 +17524,7 @@
 	 */
 	public boolean validateInformationFlow_validateSourcesAndTargetsKind(
 			InformationFlow informationFlow, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationFlow.validateSourcesAndTargetsKind(diagnostics,
 			context);
 	}
@@ -17436,7 +17537,7 @@
 	 */
 	public boolean validateInformationFlow_validateMustConform(
 			InformationFlow informationFlow, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationFlow.validateMustConform(diagnostics, context);
 	}
 
@@ -17448,7 +17549,7 @@
 	 */
 	public boolean validateInformationFlow_validateConveyClassifiers(
 			InformationFlow informationFlow, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return informationFlow.validateConveyClassifiers(diagnostics, context);
 	}
 
@@ -17458,7 +17559,7 @@
 	 * @generated
 	 */
 	public boolean validateModel(Model model, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(model, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -17499,7 +17600,7 @@
 	 * @generated
 	 */
 	public boolean validateVariableAction(VariableAction variableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(variableAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -17552,7 +17653,7 @@
 	 */
 	public boolean validateVariableAction_validateScopeOfVariable(
 			VariableAction variableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return variableAction.validateScopeOfVariable(diagnostics, context);
 	}
 
@@ -17563,7 +17664,7 @@
 	 */
 	public boolean validateReadVariableAction(
 			ReadVariableAction readVariableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(readVariableAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -17622,7 +17723,7 @@
 	 */
 	public boolean validateReadVariableAction_validateTypeAndOrdering(
 			ReadVariableAction readVariableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readVariableAction.validateTypeAndOrdering(diagnostics, context);
 	}
 
@@ -17634,7 +17735,7 @@
 	 */
 	public boolean validateReadVariableAction_validateCompatibleMultiplicity(
 			ReadVariableAction readVariableAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readVariableAction.validateCompatibleMultiplicity(diagnostics,
 			context);
 	}
@@ -17646,7 +17747,7 @@
 	 */
 	public boolean validateWriteVariableAction(
 			WriteVariableAction writeVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			writeVariableAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17705,7 +17806,7 @@
 	 */
 	public boolean validateWriteVariableAction_validateSameType(
 			WriteVariableAction writeVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return writeVariableAction.validateSameType(diagnostics, context);
 	}
 
@@ -17717,7 +17818,7 @@
 	 */
 	public boolean validateWriteVariableAction_validateMultiplicity(
 			WriteVariableAction writeVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return writeVariableAction.validateMultiplicity(diagnostics, context);
 	}
 
@@ -17728,7 +17829,7 @@
 	 */
 	public boolean validateClearVariableAction(
 			ClearVariableAction clearVariableAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			clearVariableAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17780,7 +17881,7 @@
 	 */
 	public boolean validateAddVariableValueAction(
 			AddVariableValueAction addVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			addVariableValueAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17842,7 +17943,7 @@
 	 */
 	public boolean validateAddVariableValueAction_validateSingleInputPin(
 			AddVariableValueAction addVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return addVariableValueAction.validateSingleInputPin(diagnostics,
 			context);
 	}
@@ -17854,7 +17955,7 @@
 	 */
 	public boolean validateRemoveVariableValueAction(
 			RemoveVariableValueAction removeVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			removeVariableValueAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17916,7 +18017,7 @@
 	 */
 	public boolean validateRemoveVariableValueAction_validateUnlimitedNatural(
 			RemoveVariableValueAction removeVariableValueAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return removeVariableValueAction.validateUnlimitedNatural(diagnostics,
 			context);
 	}
@@ -17928,7 +18029,7 @@
 	 */
 	public boolean validateRaiseExceptionAction(
 			RaiseExceptionAction raiseExceptionAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			raiseExceptionAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -17976,7 +18077,7 @@
 	 * @generated
 	 */
 	public boolean validateActionInputPin(ActionInputPin actionInputPin,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(actionInputPin,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -18068,7 +18169,7 @@
 	 */
 	public boolean validateActionInputPin_validateOneOutputPin(
 			ActionInputPin actionInputPin, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return actionInputPin.validateOneOutputPin(diagnostics, context);
 	}
 
@@ -18080,7 +18181,7 @@
 	 */
 	public boolean validateActionInputPin_validateInputPin(
 			ActionInputPin actionInputPin, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return actionInputPin.validateInputPin(diagnostics, context);
 	}
 
@@ -18092,7 +18193,7 @@
 	 */
 	public boolean validateActionInputPin_validateNoControlOrDataFlow(
 			ActionInputPin actionInputPin, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return actionInputPin.validateNoControlOrDataFlow(diagnostics, context);
 	}
 
@@ -18102,7 +18203,7 @@
 	 * @generated
 	 */
 	public boolean validateReadExtentAction(ReadExtentAction readExtentAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(readExtentAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -18158,7 +18259,7 @@
 	 */
 	public boolean validateReadExtentAction_validateTypeIsClassifier(
 			ReadExtentAction readExtentAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readExtentAction.validateTypeIsClassifier(diagnostics, context);
 	}
 
@@ -18170,7 +18271,7 @@
 	 */
 	public boolean validateReadExtentAction_validateMultiplicityOfResult(
 			ReadExtentAction readExtentAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return readExtentAction.validateMultiplicityOfResult(diagnostics,
 			context);
 	}
@@ -18182,7 +18283,7 @@
 	 */
 	public boolean validateReclassifyObjectAction(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			reclassifyObjectAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18241,7 +18342,7 @@
 	 */
 	public boolean validateReclassifyObjectAction_validateClassifierNotAbstract(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return reclassifyObjectAction.validateClassifierNotAbstract(
 			diagnostics, context);
 	}
@@ -18254,7 +18355,7 @@
 	 */
 	public boolean validateReclassifyObjectAction_validateMultiplicity(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return reclassifyObjectAction
 			.validateMultiplicity(diagnostics, context);
 	}
@@ -18267,7 +18368,7 @@
 	 */
 	public boolean validateReclassifyObjectAction_validateInputPin(
 			ReclassifyObjectAction reclassifyObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return reclassifyObjectAction.validateInputPin(diagnostics, context);
 	}
 
@@ -18278,7 +18379,7 @@
 	 */
 	public boolean validateReadIsClassifiedObjectAction(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			readIsClassifiedObjectAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18340,7 +18441,7 @@
 	 */
 	public boolean validateReadIsClassifiedObjectAction_validateMultiplicityOfInput(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readIsClassifiedObjectAction.validateMultiplicityOfInput(
 			diagnostics, context);
 	}
@@ -18353,7 +18454,7 @@
 	 */
 	public boolean validateReadIsClassifiedObjectAction_validateNoType(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readIsClassifiedObjectAction
 			.validateNoType(diagnostics, context);
 	}
@@ -18366,7 +18467,7 @@
 	 */
 	public boolean validateReadIsClassifiedObjectAction_validateMultiplicityOfOutput(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readIsClassifiedObjectAction.validateMultiplicityOfOutput(
 			diagnostics, context);
 	}
@@ -18379,7 +18480,7 @@
 	 */
 	public boolean validateReadIsClassifiedObjectAction_validateBooleanResult(
 			ReadIsClassifiedObjectAction readIsClassifiedObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readIsClassifiedObjectAction.validateBooleanResult(diagnostics,
 			context);
 	}
@@ -18391,7 +18492,7 @@
 	 */
 	public boolean validateStartClassifierBehaviorAction(
 			StartClassifierBehaviorAction startClassifierBehaviorAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			startClassifierBehaviorAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18447,7 +18548,7 @@
 	 */
 	public boolean validateStartClassifierBehaviorAction_validateMultiplicity(
 			StartClassifierBehaviorAction startClassifierBehaviorAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return startClassifierBehaviorAction.validateMultiplicity(diagnostics,
 			context);
 	}
@@ -18460,7 +18561,7 @@
 	 */
 	public boolean validateStartClassifierBehaviorAction_validateTypeHasClassifier(
 			StartClassifierBehaviorAction startClassifierBehaviorAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return startClassifierBehaviorAction.validateTypeHasClassifier(
 			diagnostics, context);
 	}
@@ -18472,7 +18573,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			readLinkObjectEndAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18543,7 +18644,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateProperty(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateProperty(diagnostics, context);
 	}
 
@@ -18555,7 +18656,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateAssociationOfAssociation(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateAssociationOfAssociation(
 			diagnostics, context);
 	}
@@ -18568,7 +18669,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateEndsOfAssociation(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateEndsOfAssociation(diagnostics,
 			context);
 	}
@@ -18581,7 +18682,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateTypeOfObject(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateTypeOfObject(diagnostics,
 			context);
 	}
@@ -18594,7 +18695,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateMultiplicityOfObject(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateMultiplicityOfObject(
 			diagnostics, context);
 	}
@@ -18607,7 +18708,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateTypeOfResult(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateTypeOfResult(diagnostics,
 			context);
 	}
@@ -18620,7 +18721,7 @@
 	 */
 	public boolean validateReadLinkObjectEndAction_validateMultiplicityOfResult(
 			ReadLinkObjectEndAction readLinkObjectEndAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndAction.validateMultiplicityOfResult(
 			diagnostics, context);
 	}
@@ -18632,7 +18733,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			readLinkObjectEndQualifierAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18706,7 +18807,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateQualifierAttribute(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateQualifierAttribute(
 			diagnostics, context);
 	}
@@ -18719,7 +18820,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateAssociationOfAssociation(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction
 			.validateAssociationOfAssociation(diagnostics, context);
 	}
@@ -18732,7 +18833,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateEndsOfAssociation(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateEndsOfAssociation(
 			diagnostics, context);
 	}
@@ -18745,7 +18846,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateTypeOfObject(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateTypeOfObject(
 			diagnostics, context);
 	}
@@ -18758,7 +18859,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateMultiplicityOfQualifier(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction
 			.validateMultiplicityOfQualifier(diagnostics, context);
 	}
@@ -18771,7 +18872,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateMultiplicityOfObject(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateMultiplicityOfObject(
 			diagnostics, context);
 	}
@@ -18784,7 +18885,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateSameType(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateSameType(diagnostics,
 			context);
 	}
@@ -18797,7 +18898,7 @@
 	 */
 	public boolean validateReadLinkObjectEndQualifierAction_validateMultiplicityOfResult(
 			ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return readLinkObjectEndQualifierAction.validateMultiplicityOfResult(
 			diagnostics, context);
 	}
@@ -18809,7 +18910,7 @@
 	 */
 	public boolean validateCreateLinkObjectAction(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			createLinkObjectAction, diagnostics, context);
 		if (result || diagnostics != null)
@@ -18883,7 +18984,7 @@
 	 */
 	public boolean validateCreateLinkObjectAction_validateAssociationClass(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return createLinkObjectAction.validateAssociationClass(diagnostics,
 			context);
 	}
@@ -18896,7 +18997,7 @@
 	 */
 	public boolean validateCreateLinkObjectAction_validateTypeOfResult(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return createLinkObjectAction
 			.validateTypeOfResult(diagnostics, context);
 	}
@@ -18909,7 +19010,7 @@
 	 */
 	public boolean validateCreateLinkObjectAction_validateMultiplicity(
 			CreateLinkObjectAction createLinkObjectAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return createLinkObjectAction
 			.validateMultiplicity(diagnostics, context);
 	}
@@ -18921,7 +19022,7 @@
 	 */
 	public boolean validateAcceptEventAction(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(acceptEventAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -18983,7 +19084,7 @@
 	 */
 	public boolean validateAcceptEventAction_validateNoInputPins(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptEventAction.validateNoInputPins(diagnostics, context);
 	}
 
@@ -18995,7 +19096,7 @@
 	 */
 	public boolean validateAcceptEventAction_validateNoOutputPins(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptEventAction.validateNoOutputPins(diagnostics, context);
 	}
 
@@ -19007,7 +19108,7 @@
 	 */
 	public boolean validateAcceptEventAction_validateTriggerEvents(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptEventAction.validateTriggerEvents(diagnostics, context);
 	}
 
@@ -19019,7 +19120,7 @@
 	 */
 	public boolean validateAcceptEventAction_validateUnmarshallSignalEvents(
 			AcceptEventAction acceptEventAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptEventAction.validateUnmarshallSignalEvents(diagnostics,
 			context);
 	}
@@ -19030,7 +19131,7 @@
 	 * @generated
 	 */
 	public boolean validateAcceptCallAction(AcceptCallAction acceptCallAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(acceptCallAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19101,7 +19202,7 @@
 	 */
 	public boolean validateAcceptCallAction_validateResultPins(
 			AcceptCallAction acceptCallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptCallAction.validateResultPins(diagnostics, context);
 	}
 
@@ -19113,7 +19214,7 @@
 	 */
 	public boolean validateAcceptCallAction_validateTriggerCallEvent(
 			AcceptCallAction acceptCallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptCallAction.validateTriggerCallEvent(diagnostics, context);
 	}
 
@@ -19125,7 +19226,7 @@
 	 */
 	public boolean validateAcceptCallAction_validateUnmarshall(
 			AcceptCallAction acceptCallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return acceptCallAction.validateUnmarshall(diagnostics, context);
 	}
 
@@ -19135,7 +19236,7 @@
 	 * @generated
 	 */
 	public boolean validateReplyAction(ReplyAction replyAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(replyAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19190,7 +19291,8 @@
 	 * @generated
 	 */
 	public boolean validateReplyAction_validatePinsMatchParameter(
-			ReplyAction replyAction, DiagnosticChain diagnostics, Map context) {
+			ReplyAction replyAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return replyAction.validatePinsMatchParameter(diagnostics, context);
 	}
 
@@ -19201,7 +19303,8 @@
 	 * @generated
 	 */
 	public boolean validateReplyAction_validateEventOnReplyToCallTrigger(
-			ReplyAction replyAction, DiagnosticChain diagnostics, Map context) {
+			ReplyAction replyAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return replyAction.validateEventOnReplyToCallTrigger(diagnostics,
 			context);
 	}
@@ -19212,7 +19315,7 @@
 	 * @generated
 	 */
 	public boolean validateUnmarshallAction(UnmarshallAction unmarshallAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(unmarshallAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19283,7 +19386,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateSameType(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateSameType(diagnostics, context);
 	}
 
@@ -19295,7 +19398,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateMultiplicityOfObject(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateMultiplicityOfObject(diagnostics,
 			context);
 	}
@@ -19308,7 +19411,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateNumberOfResult(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateNumberOfResult(diagnostics, context);
 	}
 
@@ -19320,7 +19423,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateTypeAndOrdering(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateTypeAndOrdering(diagnostics, context);
 	}
 
@@ -19332,7 +19435,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateMultiplicityOfResult(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateMultiplicityOfResult(diagnostics,
 			context);
 	}
@@ -19345,7 +19448,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateStructuralFeature(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateStructuralFeature(diagnostics, context);
 	}
 
@@ -19357,7 +19460,7 @@
 	 */
 	public boolean validateUnmarshallAction_validateUnmarshallTypeIsClassifier(
 			UnmarshallAction unmarshallAction, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return unmarshallAction.validateUnmarshallTypeIsClassifier(diagnostics,
 			context);
 	}
@@ -19368,7 +19471,7 @@
 	 * @generated
 	 */
 	public boolean validateReduceAction(ReduceAction reduceAction,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(reduceAction,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19426,7 +19529,8 @@
 	 * @generated
 	 */
 	public boolean validateReduceAction_validateInputTypeIsCollection(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return reduceAction.validateInputTypeIsCollection(diagnostics, context);
 	}
 
@@ -19437,7 +19541,8 @@
 	 * @generated
 	 */
 	public boolean validateReduceAction_validateOutputTypesAreCompatible(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return reduceAction.validateOutputTypesAreCompatible(diagnostics,
 			context);
 	}
@@ -19449,7 +19554,8 @@
 	 * @generated
 	 */
 	public boolean validateReduceAction_validateReducerInputsOutput(
-			ReduceAction reduceAction, DiagnosticChain diagnostics, Map context) {
+			ReduceAction reduceAction, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return reduceAction.validateReducerInputsOutput(diagnostics, context);
 	}
 
@@ -19459,7 +19565,7 @@
 	 * @generated
 	 */
 	public boolean validateControlNode(ControlNode controlNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(controlNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19507,7 +19613,7 @@
 	 * @generated
 	 */
 	public boolean validateControlFlow(ControlFlow controlFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(controlFlow,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19562,7 +19668,8 @@
 	 * @generated
 	 */
 	public boolean validateControlFlow_validateObjectNodes(
-			ControlFlow controlFlow, DiagnosticChain diagnostics, Map context) {
+			ControlFlow controlFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return controlFlow.validateObjectNodes(diagnostics, context);
 	}
 
@@ -19572,7 +19679,7 @@
 	 * @generated
 	 */
 	public boolean validateInitialNode(InitialNode initialNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(initialNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19627,7 +19734,8 @@
 	 * @generated
 	 */
 	public boolean validateInitialNode_validateNoIncomingEdges(
-			InitialNode initialNode, DiagnosticChain diagnostics, Map context) {
+			InitialNode initialNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return initialNode.validateNoIncomingEdges(diagnostics, context);
 	}
 
@@ -19638,7 +19746,8 @@
 	 * @generated
 	 */
 	public boolean validateInitialNode_validateControlEdges(
-			InitialNode initialNode, DiagnosticChain diagnostics, Map context) {
+			InitialNode initialNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return initialNode.validateControlEdges(diagnostics, context);
 	}
 
@@ -19649,7 +19758,7 @@
 	 */
 	public boolean validateActivityParameterNode(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			activityParameterNode, diagnostics, context);
 		if (result || diagnostics != null)
@@ -19726,7 +19835,7 @@
 	 */
 	public boolean validateActivityParameterNode_validateHasParameters(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activityParameterNode
 			.validateHasParameters(diagnostics, context);
 	}
@@ -19739,7 +19848,7 @@
 	 */
 	public boolean validateActivityParameterNode_validateSameType(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activityParameterNode.validateSameType(diagnostics, context);
 	}
 
@@ -19751,7 +19860,7 @@
 	 */
 	public boolean validateActivityParameterNode_validateNoEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activityParameterNode.validateNoEdges(diagnostics, context);
 	}
 
@@ -19763,7 +19872,7 @@
 	 */
 	public boolean validateActivityParameterNode_validateNoIncomingEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activityParameterNode.validateNoIncomingEdges(diagnostics,
 			context);
 	}
@@ -19776,7 +19885,7 @@
 	 */
 	public boolean validateActivityParameterNode_validateNoOutgoingEdges(
 			ActivityParameterNode activityParameterNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return activityParameterNode.validateNoOutgoingEdges(diagnostics,
 			context);
 	}
@@ -19787,7 +19896,7 @@
 	 * @generated
 	 */
 	public boolean validateForkNode(ForkNode forkNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(forkNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19842,7 +19951,7 @@
 	 * @generated
 	 */
 	public boolean validateForkNode_validateOneIncomingEdge(ForkNode forkNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return forkNode.validateOneIncomingEdge(diagnostics, context);
 	}
 
@@ -19853,7 +19962,7 @@
 	 * @generated
 	 */
 	public boolean validateForkNode_validateEdges(ForkNode forkNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return forkNode.validateEdges(diagnostics, context);
 	}
 
@@ -19863,7 +19972,7 @@
 	 * @generated
 	 */
 	public boolean validateFlowFinalNode(FlowFinalNode flowFinalNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(flowFinalNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19914,7 +20023,7 @@
 	 * @generated
 	 */
 	public boolean validateFinalNode(FinalNode finalNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(finalNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -19966,7 +20075,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalNode_validateNoOutgoingEdges(
-			FinalNode finalNode, DiagnosticChain diagnostics, Map context) {
+			FinalNode finalNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalNode.validateNoOutgoingEdges(diagnostics, context);
 	}
 
@@ -19977,7 +20087,7 @@
 	 */
 	public boolean validateCentralBufferNode(
 			CentralBufferNode centralBufferNode, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(centralBufferNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20037,7 +20147,7 @@
 	 * @generated
 	 */
 	public boolean validateMergeNode(MergeNode mergeNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(mergeNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20092,7 +20202,8 @@
 	 * @generated
 	 */
 	public boolean validateMergeNode_validateOneOutgoingEdge(
-			MergeNode mergeNode, DiagnosticChain diagnostics, Map context) {
+			MergeNode mergeNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return mergeNode.validateOneOutgoingEdge(diagnostics, context);
 	}
 
@@ -20103,7 +20214,7 @@
 	 * @generated
 	 */
 	public boolean validateMergeNode_validateEdges(MergeNode mergeNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return mergeNode.validateEdges(diagnostics, context);
 	}
 
@@ -20113,7 +20224,7 @@
 	 * @generated
 	 */
 	public boolean validateDecisionNode(DecisionNode decisionNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(decisionNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20171,7 +20282,8 @@
 	 * @generated
 	 */
 	public boolean validateDecisionNode_validateOneIncomingEdge(
-			DecisionNode decisionNode, DiagnosticChain diagnostics, Map context) {
+			DecisionNode decisionNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return decisionNode.validateOneIncomingEdge(diagnostics, context);
 	}
 
@@ -20182,7 +20294,8 @@
 	 * @generated
 	 */
 	public boolean validateDecisionNode_validateInputParameter(
-			DecisionNode decisionNode, DiagnosticChain diagnostics, Map context) {
+			DecisionNode decisionNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return decisionNode.validateInputParameter(diagnostics, context);
 	}
 
@@ -20193,7 +20306,8 @@
 	 * @generated
 	 */
 	public boolean validateDecisionNode_validateEdges(
-			DecisionNode decisionNode, DiagnosticChain diagnostics, Map context) {
+			DecisionNode decisionNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return decisionNode.validateEdges(diagnostics, context);
 	}
 
@@ -20204,7 +20318,7 @@
 	 */
 	public boolean validateActivityFinalNode(
 			ActivityFinalNode activityFinalNode, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(activityFinalNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20255,7 +20369,7 @@
 	 * @generated
 	 */
 	public boolean validateJoinNode(JoinNode joinNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(joinNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20310,7 +20424,7 @@
 	 * @generated
 	 */
 	public boolean validateJoinNode_validateOneOutgoingEdge(JoinNode joinNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return joinNode.validateOneOutgoingEdge(diagnostics, context);
 	}
 
@@ -20321,7 +20435,8 @@
 	 * @generated
 	 */
 	public boolean validateJoinNode_validateIncomingObjectFlow(
-			JoinNode joinNode, DiagnosticChain diagnostics, Map context) {
+			JoinNode joinNode, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return joinNode.validateIncomingObjectFlow(diagnostics, context);
 	}
 
@@ -20331,7 +20446,7 @@
 	 * @generated
 	 */
 	public boolean validateDataStoreNode(DataStoreNode dataStoreNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(dataStoreNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20391,7 +20506,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(objectFlow,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20467,7 +20582,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateNoActions(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return objectFlow.validateNoActions(diagnostics, context);
 	}
 
@@ -20478,7 +20593,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateCompatibleTypes(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateCompatibleTypes(diagnostics, context);
 	}
 
@@ -20489,7 +20605,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateSameUpperBounds(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateSameUpperBounds(diagnostics, context);
 	}
 
@@ -20500,7 +20617,7 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateTarget(ObjectFlow objectFlow,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return objectFlow.validateTarget(diagnostics, context);
 	}
 
@@ -20511,7 +20628,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateTransformationBehaviour(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateTransformationBehaviour(diagnostics, context);
 	}
 
@@ -20522,7 +20640,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateSelectionBehaviour(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateSelectionBehaviour(diagnostics, context);
 	}
 
@@ -20533,7 +20652,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateInputAndOutputParameter(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateInputAndOutputParameter(diagnostics, context);
 	}
 
@@ -20544,7 +20664,8 @@
 	 * @generated
 	 */
 	public boolean validateObjectFlow_validateIsMulticastOrIsMultireceive(
-			ObjectFlow objectFlow, DiagnosticChain diagnostics, Map context) {
+			ObjectFlow objectFlow, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return objectFlow.validateIsMulticastOrIsMultireceive(diagnostics,
 			context);
 	}
@@ -20555,7 +20676,7 @@
 	 * @generated
 	 */
 	public boolean validateSequenceNode(SequenceNode sequenceNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(sequenceNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20618,7 +20739,7 @@
 	 * @generated
 	 */
 	public boolean validateConditionalNode(ConditionalNode conditionalNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(conditionalNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20686,7 +20807,7 @@
 	 */
 	public boolean validateConditionalNode_validateResultNoIncoming(
 			ConditionalNode conditionalNode, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return conditionalNode.validateResultNoIncoming(diagnostics, context);
 	}
 
@@ -20696,7 +20817,7 @@
 	 * @generated
 	 */
 	public boolean validateClause(Clause clause, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(clause,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20729,7 +20850,7 @@
 	 * @generated
 	 */
 	public boolean validateClause_validateDeciderOutput(Clause clause,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return clause.validateDeciderOutput(diagnostics, context);
 	}
 
@@ -20740,7 +20861,7 @@
 	 * @generated
 	 */
 	public boolean validateClause_validateBodyOutputPins(Clause clause,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return clause.validateBodyOutputPins(diagnostics, context);
 	}
 
@@ -20750,7 +20871,7 @@
 	 * @generated
 	 */
 	public boolean validateLoopNode(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(loopNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20823,7 +20944,7 @@
 	 * @generated
 	 */
 	public boolean validateLoopNode_validateInputEdges(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return loopNode.validateInputEdges(diagnostics, context);
 	}
 
@@ -20834,7 +20955,7 @@
 	 * @generated
 	 */
 	public boolean validateLoopNode_validateBodyOutputPins(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return loopNode.validateBodyOutputPins(diagnostics, context);
 	}
 
@@ -20845,7 +20966,7 @@
 	 * @generated
 	 */
 	public boolean validateLoopNode_validateResultNoIncoming(LoopNode loopNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return loopNode.validateResultNoIncoming(diagnostics, context);
 	}
 
@@ -20855,7 +20976,7 @@
 	 * @generated
 	 */
 	public boolean validateExpansionNode(ExpansionNode expansionNode,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(expansionNode,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20915,7 +21036,7 @@
 	 * @generated
 	 */
 	public boolean validateExpansionRegion(ExpansionRegion expansionRegion,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(expansionRegion,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -20983,7 +21104,7 @@
 	 */
 	public boolean validateExpansionRegion_validateExpansionNodes(
 			ExpansionRegion expansionRegion, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return expansionRegion.validateExpansionNodes(diagnostics, context);
 	}
 
@@ -20994,7 +21115,7 @@
 	 */
 	public boolean validateComponentRealization(
 			ComponentRealization componentRealization,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			componentRealization, diagnostics, context);
 		if (result || diagnostics != null)
@@ -21030,7 +21151,7 @@
 	 * @generated
 	 */
 	public boolean validateComponent(Component component,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(component,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21096,7 +21217,7 @@
 	 * @generated
 	 */
 	public boolean validateNode(Node node, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(node, diagnostics,
 			context);
 		if (result || diagnostics != null)
@@ -21165,7 +21286,7 @@
 	 * @generated
 	 */
 	public boolean validateNode_validateInternalStructure(Node node,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return node.validateInternalStructure(diagnostics, context);
 	}
 
@@ -21175,7 +21296,7 @@
 	 * @generated
 	 */
 	public boolean validateDevice(Device device, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(device,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21244,7 +21365,7 @@
 	 */
 	public boolean validateExecutionEnvironment(
 			ExecutionEnvironment executionEnvironment,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(
 			executionEnvironment, diagnostics, context);
 		if (result || diagnostics != null)
@@ -21314,7 +21435,7 @@
 	 */
 	public boolean validateCommunicationPath(
 			CommunicationPath communicationPath, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(communicationPath,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21385,7 +21506,7 @@
 	 */
 	public boolean validateCommunicationPath_validateAssociationEnds(
 			CommunicationPath communicationPath, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO override the constraint, if desired
 		// -> uncomment the scaffolding
 		// -> specify the condition that violates the constraint
@@ -21415,7 +21536,7 @@
 	 * @generated
 	 */
 	public boolean validateFinalState(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(finalState,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21494,7 +21615,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateNoOutgoingTransitions(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalState.validateNoOutgoingTransitions(diagnostics, context);
 	}
 
@@ -21505,7 +21627,7 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateNoRegions(FinalState finalState,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return finalState.validateNoRegions(diagnostics, context);
 	}
 
@@ -21516,7 +21638,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateCannotReferenceSubmachine(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalState.validateCannotReferenceSubmachine(diagnostics,
 			context);
 	}
@@ -21528,7 +21651,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateNoEntryBehavior(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalState.validateNoEntryBehavior(diagnostics, context);
 	}
 
@@ -21539,7 +21663,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateNoExitBehavior(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalState.validateNoExitBehavior(diagnostics, context);
 	}
 
@@ -21550,7 +21675,8 @@
 	 * @generated
 	 */
 	public boolean validateFinalState_validateNoStateBehavior(
-			FinalState finalState, DiagnosticChain diagnostics, Map context) {
+			FinalState finalState, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return finalState.validateNoStateBehavior(diagnostics, context);
 	}
 
@@ -21560,7 +21686,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeEvent(TimeEvent timeEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(timeEvent,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21603,7 +21729,8 @@
 	 * @generated
 	 */
 	public boolean validateTimeEvent_validateWhenNonNegative(
-			TimeEvent timeEvent, DiagnosticChain diagnostics, Map context) {
+			TimeEvent timeEvent, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
 		return timeEvent.validateWhenNonNegative(diagnostics, context);
 	}
 
@@ -21614,7 +21741,7 @@
 	 * @generated
 	 */
 	public boolean validateTimeEvent_validateStartingTime(TimeEvent timeEvent,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return timeEvent.validateStartingTime(diagnostics, context);
 	}
 
@@ -21625,7 +21752,7 @@
 	 */
 	public boolean validateProtocolTransition(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(protocolTransition,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21702,7 +21829,7 @@
 	 */
 	public boolean validateProtocolTransition_validateBelongsToPsm(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return protocolTransition.validateBelongsToPsm(diagnostics, context);
 	}
 
@@ -21714,7 +21841,7 @@
 	 */
 	public boolean validateProtocolTransition_validateAssociatedActions(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return protocolTransition.validateAssociatedActions(diagnostics,
 			context);
 	}
@@ -21727,7 +21854,7 @@
 	 */
 	public boolean validateProtocolTransition_validateRefersToOperation(
 			ProtocolTransition protocolTransition, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return protocolTransition.validateRefersToOperation(diagnostics,
 			context);
 	}
@@ -21738,7 +21865,7 @@
 	 * @generated
 	 */
 	public boolean validateAssociationClass(AssociationClass associationClass,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validate_EveryMultiplicityConforms(associationClass,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21821,7 +21948,7 @@
 	 */
 	public boolean validateAssociationClass_validateCannotBeDefined(
 			AssociationClass associationClass, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return associationClass.validateCannotBeDefined(diagnostics, context);
 	}
 
@@ -21831,7 +21958,7 @@
 	 * @generated
 	 */
 	public boolean validateVisibilityKind(VisibilityKind visibilityKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21842,7 +21969,7 @@
 	 */
 	public boolean validateCallConcurrencyKind(
 			CallConcurrencyKind callConcurrencyKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21852,7 +21979,7 @@
 	 * @generated
 	 */
 	public boolean validateTransitionKind(TransitionKind transitionKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		boolean result = validateTransitionKind_state_is_local(transitionKind,
 			diagnostics, context);
 		if (result || diagnostics != null)
@@ -21869,7 +21996,7 @@
 	 */
 	public boolean validateTransitionKind_state_is_local(
 			TransitionKind transitionKind, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO implement the constraint
 		// -> specify the condition that violates the constraint
 		// -> verify the diagnostic details, including severity, code, and message
@@ -21899,7 +22026,7 @@
 	 */
 	public boolean validateTransitionKind_state_is_external(
 			TransitionKind transitionKind, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		// TODO implement the constraint
 		// -> specify the condition that violates the constraint
 		// -> verify the diagnostic details, including severity, code, and message
@@ -21927,7 +22054,7 @@
 	 * @generated
 	 */
 	public boolean validatePseudostateKind(PseudostateKind pseudostateKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21937,7 +22064,7 @@
 	 * @generated
 	 */
 	public boolean validateAggregationKind(AggregationKind aggregationKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21948,7 +22075,7 @@
 	 */
 	public boolean validateParameterDirectionKind(
 			ParameterDirectionKind parameterDirectionKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21959,7 +22086,7 @@
 	 */
 	public boolean validateParameterEffectKind(
 			ParameterEffectKind parameterEffectKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21969,7 +22096,7 @@
 	 * @generated
 	 */
 	public boolean validateConnectorKind(ConnectorKind connectorKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21979,7 +22106,7 @@
 	 * @generated
 	 */
 	public boolean validateMessageKind(MessageKind messageKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -21989,7 +22116,7 @@
 	 * @generated
 	 */
 	public boolean validateMessageSort(MessageSort messageSort,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22000,7 +22127,7 @@
 	 */
 	public boolean validateObjectNodeOrderingKind(
 			ObjectNodeOrderingKind objectNodeOrderingKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22011,7 +22138,7 @@
 	 */
 	public boolean validateInteractionOperatorKind(
 			InteractionOperatorKind interactionOperatorKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22021,7 +22148,7 @@
 	 * @generated
 	 */
 	public boolean validateExpansionKind(ExpansionKind expansionKind,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22031,7 +22158,7 @@
 	 * @generated
 	 */
 	public boolean validateInteger(int integer, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22041,7 +22168,7 @@
 	 * @generated
 	 */
 	public boolean validateBoolean(boolean boolean_,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22051,7 +22178,7 @@
 	 * @generated
 	 */
 	public boolean validateString(String string, DiagnosticChain diagnostics,
-			Map context) {
+			Map<Object, Object> context) {
 		return true;
 	}
 
@@ -22061,7 +22188,7 @@
 	 * @generated
 	 */
 	public boolean validateUnlimitedNatural(int unlimitedNatural,
-			DiagnosticChain diagnostics, Map context) {
+			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		return true;
 	}
 
